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
}