2016-01-22 90 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); 
相關問題