1

次のコンソール アプリを使用します

    static void Main(string[] args)
    {
        Thread connector = new Thread(Connector);
        connector.Start();

        while (true)
        {
            Thread.Sleep(500);
        }
    }

    private static void Connector()
    {
        SignalR.Client.Hubs.HubConnection connection = new SignalR.Client.Hubs.HubConnection("http://192.168.42.10:1327/Chat");

        SignalR.Client.Hubs.IHubProxy loginHub = connection.CreateProxy("LoginHub");

        connection.Received += connection_Received;
        connection.Reconnected += connection_Reconnected;
        connection.StateChanged += connection_StateChanged;
        connection.Error += connection_Error;
        connection.Closed += connection_Closed;

        connection.Start().Wait();
    }

LoginHub は IDisconnect を実装します。

アプリを起動して接続し、ネットワーク ケーブルを引き、サーバー側の切断イベントが発生するのを待ち、ネットワーク ケーブルを再接続すると、クライアントが再接続され、すぐに接続が閉じられます。

サーバー側の切断が発生する前にネットワークケーブルを抜き差しすると、接続は正常に再接続されます。

これは意図した動作ですか?再接続はどのように機能するはずですか?

4

1 に答える 1

2

EDITED(再読して、私が明確ではないことがわかりました):クライアントがSSEですぐに切断されると、ほとんどの場合(0.5.3で)、無限の再接続ループにスローされます(以下のバグを参照)。

ただし、場合によっては、再接続してすぐに切断することがありますが、これは意図的な動作です。クライアントを強制的に切断する理由は、この時点でサーバーがクライアントのことを完全に忘れているためです。したがって、クライアントは $.connection.hub.start などを介して接続を再インスタンス化する必要があります。

次のリリースでは、無限再接続の問題を修正し、プロセスに「警告」を追加して、サーバーがダウンしている可能性があることを開発者に通知しました (onConnectionSlow)。再接続に成功し、サーバーがあなたのことを忘れている場合は、切断するように指示されます。

バグへの参照は次のとおりです: https://github.com/SignalR/SignalR/issues/687

于 2012-09-27T17:11:31.307 に答える