Сведения об ошибке подключения SignalR с помощью Longpolling

В jquery.signalR-1.1.3.js функция ошибки длинного опроса возвращает текст ответа вместо всего объекта jqXHR.

Есть ли хороший способ определить в обработчике ошибок концентратора, что на самом деле представляет собой ошибка?

$.connection.hub.error(function (error) {
            system.log('SignalR error: ' + error);
        });

Я использовал атрибут SignalR [Authorize], чтобы вернуть HTTP 403 Forbidden, когда в соединении должно быть отказано, но в моем клиенте все, что я получаю, — это страница ответа страницы ошибки IIS в объекте ошибки, потому что SignalR не передает обратно весь объект ответа, см. ниже : $(instance).triggerHandler(events.onError, [data.responseText]);. Это происходит в замкнутом цикле, потому что SignalR просто пытается повторно подключиться несколько сотен/тысяч/несколько раз, пока не истечет время ожидания повторного подключения.

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

Вот обработчик ошибок транспорта с длительным опросом:

error: function (data, textStatus) {
// Stop trying to trigger reconnect, connection is in an error state
// If we're not in the reconnect state this will noop
window.clearTimeout(reconnectTimeoutId);
reconnectTimeoutId = null;

if (textStatus === "abort") {
    connection.log("Aborted xhr requst.");
    return;
}

// Increment our reconnect errors, we assume all errors to be reconnect errors
// In the case that it's our first error this will cause Reconnect to be fired
// after 1 second due to reconnectErrors being = 1.
reconnectErrors++;

if (connection.state !== signalR.connectionState.reconnecting) {
    connection.log("An error occurred using longPolling. Status = " + textStatus + ". " + data.responseText);
    $(instance).triggerHandler(events.onError, [data.responseText]);
}

// Transition into the reconnecting state
transportLogic.ensureReconnectingState(instance);

// If we've errored out we need to verify that the server is still there, so re-start initialization process
// This will ping the server until it successfully gets a response.
that.init(instance, function () {
    // Call poll with the raiseReconnect flag as true
    poll(instance, true);
});

}

И код авторизации концентратора на стороне сервера

public override bool AuthorizeHubConnection(Microsoft.AspNet.SignalR.Hubs.HubDescriptor hubDescriptor, Microsoft.AspNet.SignalR.IRequest request)
{
    // If we want them to connect, return true, else false
    // Asp.NET will return a 403 if we return false here
    return false;
}

Возникает пара вопросов...

  1. Почему signalR снова соединяется в такой тугой петле?
  2. Есть ли лучший способ управления жизненным циклом подключения signalR на основе авторизации подключения к концентратору?

person pseabury    schedule 19.09.2013    source источник


Ответы (1)


  1. Это ошибка, которая была исправлена ​​в версии 2.0 и будет исправлена ​​в версии 1.1.5.
  2. Да, убедитесь, что вы не отображаете страницу, которая пытается установить подключение SignalR, если пользователь не авторизован.
person davidfowl    schedule 19.09.2013
comment
№1 - Хорошо, я это понимаю. № 2. Это не отвечает на вопрос об использовании атрибута авторизации signalR для авторизации соединений, а просто предлагает другой подход... тот, который мое приложение в настоящее время не использует. - person pseabury; 19.09.2013
comment
Вы можете сделать оба правильно? Вы сохраняете атрибут авторизации на концентраторе, но вы можете убедиться, что никто не попадет на эту страницу, если они также не авторизованы, чтобы клиент сигнализатора не сошел с ума из-за неавторизованных пользователей. Если это не вариант, то единственный другой способ - изменить javascript сигнализатора самостоятельно. - person davidfowl; 19.09.2013
comment
Хороший вопрос, и я на самом деле делаю и то, и другое. Проблема, над которой я сейчас работаю, заключается в том, что с одним и тем же файлом cookie аутентификации тестер, клонирующий вкладки в браузере (предположительно, все они должны иметь один и тот же действительный файл cookie Asp.NET Auth), переходит в состояние, которое заставляет атрибут авторизации signalR возвращать 403 , Спасибо, Дэвид. - person pseabury; 19.09.2013