Повторное подключение соединения, подписанного на концентратор, приводит к немедленному отключению.

Возьмите следующее консольное приложение

    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.

Если я запущу приложение, позволю ему подключиться, вытащу сетевой кабель, дождусь срабатывания события отключения на стороне сервера, снова подключу сетевой кабель, клиент снова подключится, а затем немедленно закроет свое соединение.

Если я отсоединяю и снова подсоединяю сетевой кабель до того, как сработает отключение на стороне сервера, соединение снова восстанавливается.

Это намеренное поведение? Как должно работать повторное подключение?


person Julien    schedule 25.09.2012    source источник


Ответы (1)


EDITED (перечитал и увидел, что я не совсем понял): когда клиент немедленно отключается с помощью SSE, в большинстве случаев (в 0.5.3) он будет брошен в бесконечный цикл повторного подключения (см. ошибку ниже).

Однако в некоторых случаях он повторно подключается, а затем немедленно отключается, что является преднамеренным поведением. Причина, по которой мы заставляем клиента отключиться, заключается в том, что в этот момент сервер полностью забыл о клиенте. Поэтому клиенту необходимо повторно создать соединение через $.connection.hub.start и т. д.

В следующем выпуске мы исправили проблемы с бесконечным повторным подключением, а также добавили в процесс «предупреждение», чтобы уведомить разработчиков о том, что сервер может быть недоступен (onConnectionSlow). Конечно, если вы успешно переподключитесь и сервер забудет о вас, вам будет предложено отключиться.

Вот ссылка на ошибку: https://github.com/SignalR/SignalR/issues/687< /а>

person N. Taylor Mullen    schedule 27.09.2012