簡體   English   中英

重新連接時客戶端 SignalR 收不到消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM