简体   繁体   中英

SignalR Multiple Hub at Sametime

I defined 2 separate hub in my project, Which is seem they parse into single proxy... and i'm not against it, let it be.

Next i defined my client, the time i had one client i had no issue with it, but now that i have two hub, and both come to work at a single page, once the first hub start it work well, request goes to server and back. but once i call the partial page, which connect and talk to second hub, it goes to connection.start, but it wont break on server, mean server is not notified of this action... . now can any one help me?

Controller1:

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:

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:

namespace SignalRChatSystem.Hubs
{
    [ChatAuthorize]
    public class ChatHub : Hub
    {
        ...

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

            return base.OnConnected();
        }
        ...

    }
}

Hub2:

namespace SignalRChatSystem.Hubs
{
    [UserAuthorize]
    public class UserHub : Hub
    {
        ...

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

            return base.OnConnected();
        }
        ...

    }
}

Mapping

[assembly: OwinStartupAttribute(typeof(SignalRChatSystem.Startup))]
namespace SignalRChatSystem
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
            app.MapSignalR();
        }
    }
}

You should call $.connection.hub.start() only once, even if using multiple hubs. See: http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-javascript-client#establishconnection

If you are not sure if connection was started earlier on not, you could check before starting it, using the connectionState object.

$.signalR.connectionState
Object {connecting: 0, connected: 1, reconnecting: 2, disconnected: 4}

So your start method could be like this:

if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.disconnected) {
    $.connection.hub.start(); 
    //...
}

If your connection is already open, you can call directly what is in the .done() { body. Maybe you can check before:

if ($.connection.hub && $.connection.hub.state === $.signalR.connectionState.connected) {
    // ... logic for second hub here
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM