The On event on the SignalR Client Hub does not ge

2020-02-28 00:32发布

问题:

I seem to have an issue with SignalR's JS Client Hub.

The problem is that the 'on' handler does not seem to work - it generates no error but doesn't receive any signals sent by the server. The code below shows an extract where I call the server (using the invoke) which works fine - then on the server I call back to acceptHubData which should be picked up on the client but isn't.

My objective is when navigating to pages that each page will open a connection to a specific hub and releases this connection when the user moves to another page!!

EDIT: using the following code snippet works but I wonder why the code further below using the 'on' event doesn't work!

    var superHub = $.connection.mySuperHub;

    superHub.client.acceptHubData = function (data) {
        $('<li>hello there' + data + '</li>').prependTo($('#ul1'))
    }

    $.connection.hub.start().done(function () {
        $('<li>done phase 1</li>').prependTo($('#ul1'))
    });

Any help would be much appreciated!

This is the client code (in js)

$(document).ready(function () {

    var myHub;

    try {

        var connection = $.hubConnection();

        connection.start().done(function () {

            myHub = connection.createHubProxy("mySuperHub");

            myHub.on('acceptHubData', function (data) {
                alert(data);   // THIS IS NOT CALLED!
            });

            myHub.invoke('AcceptSignal', "hello from the client2");

        });

    }
    catch (e) {
        alert(e.message);
    }
});

This is the Server code:

[HubName("mySuperHub")]
public class MyHub : Hub
{

    private readonly HubEngine _hubEngine;

    public MyHub() : this(HubEngine.Instance) { }

    public MyHub(HubEngine hubEngine)
    {
        _hubEngine = hubEngine;
    }

    public void AcceptSignal(string msg)
    {
        Clients.Caller.acceptHubData("hi");
        Clients.All.acceptHubData("hi");
    }

}

回答1:

You can still use the on method to add events for JS client hub method calls in the latest version of SignalR, but if you do not add any event listeners to a hubProxy before calling hubConnection.start(), you will not be subscribed to the hub. SignalR subscribes to the hubs you have event handlers for when the hubConnection starts. If you are not subscribed to your hub, adding any events to that hub after start() won't work.

If you add at least one event listener to the hub before start(), even if it doesn't do anything, you can then add any additional event handlers you want to the hub using on after start() and your handlers will be called.

It doesn't matter if you add an event using hubProxy.on('eventName', function (... or autogeneratedHubProxy.client.eventName = function (... before you call start(), but only on will successfully add event listeners after start() is called.



回答2:

Not sure which version of SignalR you are using, but I have had more success using the following syntax on my server:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.acceptHubData("hello");    

and on my clients:

myHub.client.acceptHubData = function (data) {
    console.log(data);
}