[英]Client side SignalR on reconnect doesn't receive messages
我有 SignalR 集線器在作為服務運行的服務器上運行。 這個服務器無論出於什么原因,可能會因為斷電、正在更新(我們使用八達通自動更新)或其他原因而停止。
如果我有一個連接到此服務的用戶向服務器發送消息,然后將此消息轉發給傳感器。 然后傳感器向服務器返回一條消息,並轉發到客戶端 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
}
我發現了問題所在。 我需要在客戶端代碼中包裝$timeout
,因為C#代碼似乎有點延遲。 調試初始化程序后,我從chrome開發工具中偶然發現了這一點,以為未傳遞用戶ID一定是錯誤的。 在調用初始化處添加斷點后,它將在那兒進行工作,但是從那繼續,之后我會收到消息。 沒有斷點,我不會。 所以我在通話中添加了$timeout
。
$timeout(function () {
initializeTerminal();
}, 100);
不起作用 - 由於 jquery 版本
<script src="~/Scripts/jquery-3.6.0/jquery-3.6.0.min.js"></script>
<script src="~/Scripts/signalr/jquery.signalR-2.4.2.js"></script>
<script src="~/signalr/hubs"></script>
<script src="~/Areas/Noc/NocDOCSIS/Scripts/script.noc.light.js"></script>
有效 - 由於 Jquery 版本
<script src="~/Scripts/jquery-2.2.4/jquery-2.2.4.min.js"></script>
<script src="~/Scripts/signalr/jquery.signalR-2.4.2.js"></script>
<script src="~/signalr/hubs"></script>
<script src="~/Areas/Noc/NocDOCSIS/Scripts/script.noc.light.js"></script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.