重新连接时客户端SignalR不接收消息

时间:2016-01-22 14:00:31

标签: javascript c# angularjs signalr

我在运行为服务的服务器上运行SignalR Hub。无论出于何种原因,该服务器可能会因断电,更新(我们使用Octopus自动更新)或其他原因而停止。

如果我有连接到此服务的用户向服务器发送消息,然后将此消息转发给传感器。然后,传感器将消息返回给服务器,并转发到客户端webapp。

这在第一次连接时工作正常。如果服务在重新连接超时之前停止并重新启动,我将使用相同的连接ID重新连接,并且我可以发送消息。但是我不能接收消息。

如果我刷新页面,我会得到它们,因为这会创建一个新连接。无论是OnConnect()还是OnReconnect(),都会调用相同的代码。

示例

public override Task OnConnected()
    {
        EstablishConnection("Connect");
        return base.OnConnected();
    }

    public override Task OnReconnected()
    {
        // Remove old Connection Id to receive messages on reconnect
        ConnectionsHandler.Instance.RemoveTerminalClient(Context.ConnectionId);

        EstablishConnection("Reconnect");

        // This block is to tell the user that connection has been reconnected. This message shows on the webapp so connection has been restored.
        var hubContext = GlobalHost.ConnectionManager.GetHubContext<TerminalHub>();
        var message = TerminalMessageColorer.ColorMessageLime(String.Format("Connection has been re-established!"));
        hubContext.Clients.Client(Context.ConnectionId).TerminalEcho(message);

        return base.OnReconnected();
    }

    private void EstablishConnection(string conType)
    {
        ConnectionsHandler.Instance.AddTerminalClient(Context.ConnectionId, "null");
        var terminal = ConnectionsHandler.Instance.GetTerminalClient(Context.ConnectionId);
#if DEBUG
        Console.ForegroundColor = ConsoleColor.Yellow;
        Console.WriteLine("{0}\t{1}\t...{2}", terminal, Context.ConnectionId, conType);
#endif
    }

1 个答案:

答案 0 :(得分:1)

我发现了问题所在。我需要在客户端代码中包含@media screen and (min-width: 600px) { // Import code } ,因为C#代码似乎有点延迟。在我调试初始化程序时,我偶然发现了chrome dev工具,认为用户ID没有被传递的错误。一旦我在初始化的调用中添加了一个断点,它就会去那里工作,但是从那里开始我会收到消息。如果没有断点,我就不会这样做。所以我在电话会议中添加了$timeout

$timeout