首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SignalR多集线器在Sametime

SignalR多集线器在Sametime
EN

Stack Overflow用户
提问于 2015-05-26 13:24:59
回答 1查看 3.1K关注 0票数 0

我在我的项目中定义了两个单独的集线器,看起来它们解析成一个代理.我不反对,随你去吧。

接下来,我定义了我的客户机,当我有一个客户机时,我对它没有任何问题,但是现在我有了两个集线器,它们都在一个页面上工作,一旦第一个集线器正常工作,请求就会发送到服务器并返回。但是,一旦我调用了连接到第二个集线器并与其对话的部分页面,它就会转到connection.start,但它不会在服务器上中断,这意味着服务器不会被通知此操作.。现在有人能帮我吗?

Controller1:

代码语言:javascript
复制
var app = angular.module("chatApplication", []);
var myHub = $.connection.chatHub;

app.controller("ChatController", [
    "$scope", "$timeout", "$templateCache",
    function ($scope, $timeout, $templateCache) {

        ...

        $scope.RegisterClientMethod(myHub);

        myHub.connection.start().done(function () {
            //Already uses OnConnect Override

            //TODO: Link Events To Required Buttons And Actions
            //like: $(x).click(fnX);

            //TODO: Call Started Events
            //myHub.server.hello();
        }).fail(function (e) {
            $scope.connectionMessage = "Connection Failed" + e.toString();
            $scope.$apply();
        });
    }

]);

Controller2:

代码语言:javascript
复制
var myUserHub = $.connection.userHub;

app.controller("UserController", [
    "$scope", "$timeout", "$templateCache",
    function($scope, $timeout, $templateCache) {

        ...

        $scope.RegisterClientMethod(myUserHub);
        $scope.RegisterWatchers();

        myUserHub.server.getUsers();

        myUserHub.connection.start().done(function () {
            //Since Connection is already open, by chatHub, we cannot relay on that
            myUserHub.server.getUsers();
        }).fail(function (e) {
            $scope.connectionMessage = "Connection Failed" + e.toString();
            $scope.$apply();
        });
    }
]);

Hub1:

代码语言:javascript
复制
namespace SignalRChatSystem.Hubs
{
    [ChatAuthorize]
    public class ChatHub : Hub
    {
        ...

        public override Task OnConnected()
        {
            //client.doSomething

            return base.OnConnected();
        }
        ...

    }
}

Hub2:

代码语言:javascript
复制
namespace SignalRChatSystem.Hubs
{
    [UserAuthorize]
    public class UserHub : Hub
    {
        ...

        public override Task OnConnected()
        {
            //client.doSomething

            return base.OnConnected();
        }
        ...

    }
}

映射

代码语言:javascript
复制
[assembly: OwinStartupAttribute(typeof(SignalRChatSystem.Startup))]
namespace SignalRChatSystem
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            app.MapSignalR();
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-08-03 01:32:42

您应该只调用$.connection.hub.start()一次,即使使用多个集线器。请参阅:http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client#establishconnection

如果您不确定之前是否启动了连接,可以在启动之前使用connectionState对象进行检查。

代码语言:javascript
复制
$.signalR.connectionState
Object {connecting: 0, connected: 1, reconnecting: 2, disconnected: 4}

所以您的开始方法可以是这样的:

代码语言:javascript
复制
if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.disconnected) {
    $.connection.hub.start(); 
    //...
}

如果您的连接已经打开,您可以直接调用.done() {主体中的内容。也许你可以先检查一下:

代码语言:javascript
复制
if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.connected) {
    // ... logic for second hub here
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30459903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档