Reusing same connection in signalR while navigatin

2019-02-09 20:02发布

问题:

I have an MVC project, with multiple pages.

I have a long running process, which updates the client on its progress. However, this update is sent only to a single client, instead of broadcasting to all.

Clients.Client(ConnectionId).sendMessage(msg);

In my layout.cshtml, this is how I connect to the hub

    var serverHub = $.connection.notifier;
    window.hubReady = $.connection.hub.start(function () { });

The problem is, when I navigate to another page, I no longer receive the messages from signalr, because the connection id has changed.

How should I workaround this issue, such that my signalr hub can still send messages to a single client, while the client navigates from page to page.

回答1:

You will want to create a server mapping of users to connection id's. See: SignalR 1.0 beta connection factory.

You will want to let your users persist past an OnDisconnected event and when they connect with a different connection Id you can continue pumping data down to them.

So the thought process could be as follows:

  1. Page loads, SignalR connection is instantiated
  2. Once connection is fully started call => TryCreateUser (returns a user, whether it existed or it was created).
  3. Long Running process Starts
  4. Client changes pages -> SignalR connection stops
  5. New Page loads, new SignalR connection is instantiated
  6. Once connection is fully started see if you have a cookie, session, or some type of data representing who you are => TryCreateUser(userData) (returns the user you created on the last page).
  7. Data continues pumping down to user.

Note: if you take an authentication approach you will have to be authenticated prior to starting a connection and that data cannot change during the lifetime of a SignalR connection, it can only be created/modified while the connection is in the disconnected state.