Arhn - архитектура программирования

Соединение SignalR замораживает другие запросы ajax

Я разрабатываю приложение asp.net mvc с системой обмена сообщениями в реальном времени на основе SignalR (jquery.signalR-2.0.0-beta2.js). Проблема в том, что все частичные представления не могут быть загружены после запуска подключения SignalR. В этом случае все запросы ajax после $.connection.hub.start({ transport: 'longPolling'}).done(function () { applicationHub.server.connectUser(); }) остаются в состоянии ожидания. Можно ли сделать эти запросы асинхронными или это ошибка в SignalR? Спасибо за вашу помощь!

Вызов SignalR:

<script type="text/javascript">

    $(document).ajaxStop(function () {
        var applicationHub = $.connection.applicationHub;

        if ($.connection.hub && $.connection.hub.state == $.signalR.connectionState.disconnected) {

            registerConversationClientMethods(applicationHub);

            $.connection.hub.start({ transport: 'longPolling'}).done(function () {
                applicationHub.server.connectUser();
            })
            .fail(function () {

            });
        }
    });
</script>

Вызов Ajax, который отображает частичное представление:

function LoadActivities(id, type, container, action, loaderpath) {

var url = action + '/?id=' + id + '&type=' + type;
var targetDiv = container;
var ajaxLoading = "<img id='ajax-loader' src='" + loaderpath + "' height='6' width='50' style='margin:5px;'>";

$(targetDiv).html("<div align='center'>" + ajaxLoading + "</div>");

$.get(url, null, function (result) {
    $(targetDiv).html(result);
});

}


  • вы используете iOS? Это проблема? github.com/SignalR/SignalR/issues/1406 23.07.2013
  • нет, я использую Windows 7. Ваша проблема имеет похожее поведение, но это не то, что я выясняю. Все асинхронные запросы ajax остаются в состоянии ожидания после запуска запроса ajax SignalR (poll?transport=longPolling&connectionToken=1Kpx%2B72...), который также находится в состоянии ожидания (как и должно быть). 24.07.2013
  • Windows 7 + полный IIS (не iis Express) имеет ограничение на количество одновременных подключений 10. Используете ли вы полный iis? 24.07.2013
  • Та же проблема здесь. У меня есть три решения, одно из которых имеет аналогичную проблему. Windows 8 и полный IIS. Если я прекращу подключение SignalR через консоль разработчика, другие запросы начнут получать ответы. При запуске соединения сервер не отвечает. Используя fiddler, я вижу, что запросы отправляются. 07.08.2013
  • Я решил это для веб-сайта, где у меня были проблемы с зависанием. Состояние сеанса было включено в корне сервера. 08.08.2013

Ответы:


1

У меня есть другое объяснение того, что могло вызвать проблему.

Поскольку вопрос был задан в 2013 году, я предполагаю, что автор уже нашел решение своей проблемы. Но так как мне понадобилось несколько часов, чтобы копаться в своей, считаю своим долгом поделиться своим опытом.

Обзор архитектуры: приложение Asp.Net SPA с AngularJS на стороне клиента и WebApi 2.0 и SignalR 2.1 на стороне сервера.

Симптомы проблемы: приложение запускается и работает нормально, но через некоторое время все запросы (SignalR и WebApi) зависают. Под «зависанием» я подразумеваю, что запросы WebApi выполняются на клиенте, но методы контроллера никогда не вызываются. Первым зависает всегда запрос SignalR.

Сетевой монитор

После некоторого поиска я нашел наиболее вероятную причину этих симптомов. Это была проблема «Блокировка состояния сеанса», подробно описанная в это сообщение Джона Калвинера.

Поскольку мое приложение не использовало сеансы, я просто переключил их в режим только для чтения на уровне приложения:

protected void Application_Start()
{
    // Some extra initialization here
    Context.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.ReadOnly);
}

Это не помогло.

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

У моей проблемы есть хорошее описание в этом статья Шона. Вот обзор. В стандартном мире MVC SignalR сам управляет своим соединением. Он отключится автоматически, когда вы перейдете на другую страницу. Таким образом, вы можете просто создать соединение и забыть об этом. К сожалению, это не так для приложений SPA/AngularJS. Соединение SignalR никогда не узнает, что страница внутри SPA была изменена, и никогда не отключится. Когда вы вернетесь на страницу, будет создано новое подключение SignalR. По моим наблюдениям, вам нужно сделать это около 10 раз, чтобы канал, обслуживающий запросы, застрял.

Итак, все, что вам нужно сделать здесь, это создать функцию остановки для подключения SignalR и вызвать ее вручную перед изменением страницы внутри SPA:

stop: function() {
    if (connection && connection.state && connection.state !== 4 /* disconnected */) {
        connection.stop();
    }
},

В контроллере:

$scope.$on('$destroy', function() {
    clientPushHubProxy.stop();
});
18.02.2015
  • Я столкнулся с той же проблемой, но я не использую AngularJS (я использую ASp.net MVC). Не могли бы вы предложить, как остановить соединение с помощью jquery. 12.04.2017

  • 2

    Если взять ответ @bjornhol немного дальше - та же проблема со всеми запросами SignalR (которые загружали больше AJAX) возникала и у меня. Я думал, что проблема в jQuery, но на самом деле это состояние сеанса. Для этого контроллера, если вы можете установить SessionStateBehaviour в ReadOnly или Disabled, вы увидите, что запросы выполняются одновременно. См. также эту ссылку http://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/ Надеюсь, это поможет.

    09.08.2013
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..