2016-01-22 91 views
1

我的服务器上运行的SignalR Hub作为服务运行。无论出于何种原因,这台服务器可能因停电而停止更新(我们使用Octopus自动更新),或者其他任何情况。重新连接的客户端SignalR没有收到消息

如果我有一个用户连接到此服务发送消息到服务器,然后转发此消息传感器。传感器然后将消息返回给服务器,并转发到客户端Web应用程序。

这适用于第一个连接。如果服务在重新连接超时之前停止并重新启动,则我使用相同的连接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

我发现了什么问题。我需要在客户端代码中包装$timeout,因为在C#代码中似乎有点延迟。我在调试初始化程序时偶然发现了chrome开发工具,认为某些用户标识没有被传递是错误的。一旦我在调用初始化时添加了一个断点,它就会去那里工作,但是从那里继续我会在之后收到消息。没有断点,我不会。所以我在呼叫周围加了$timeout

$timeout(function() { 
    initializeTerminal(); 
}, 100); 
相关问题