Поведение SignalR: предотвращение длительного опроса

#c# #asp.net-mvc #signalr #signalr-hub #signalr.client

#c# #asp.net-mvc #signalr #signalr-концентратор #signalr.client

Вопрос:

Мне интересно использовать SignalR в моем веб-приложении (c #, mvc).

Сценарий: мои пользователи предоставляют мне входные данные, а я обрабатываю их и показываю им результаты. Эта обработка может быть очень долгой. Как долго? допустим, 3 минуты (в зависимости от сетевого трафика, использования, … — не может быть предопределено). В настоящее время я выполняю этот процесс в AJAX-запросе для длительного опроса. Во время выполнения AJAX я показываю на экране: «Пожалуйста, подождите».

Теперь я добавил к этому сценарию новое ограничение сервера: поскольку я использую CloudFlare, они ограничивают меня тем, что каждый запрос должен занимать менее 100 секунд. В противном случае они прерывают запрос.

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

Я читаю на веб-сайте SignalR, что они проверяют возможности клиента и решают, с какой технологией использовать.

Меня беспокоит: поскольку CloudFlare ограничивает запрос ответ 100 секундами, это может создать проблемы для SignalR. Допустим, мой клиент является клиентом без какой-либо новой веб-функции (например, WebSocket или другой). Это может привести к тому, что SignalR выполнит длительный опрос, который может завершиться неудачей.

Возможно ли определить SignalR, чтобы избежать длительного опроса? Или как вы рекомендуете избежать этого проблемного случая.

Комментарии:

1. Хорошим местом для начала была бы документация .

Ответ №1:

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

По умолчанию сервер SignalR закрывает запросы на опрос, которые были открыты в течение 110 секунд без получения сообщений. Конечно, если сообщение отправляется клиенту до истечения 110 секунд, запрос на опрос будет закрыт после отправки сообщения. В обоих сценариях клиент SignalR выполнит повторный опрос, когда сервер закроет предыдущий опрос (в противном случае, я думаю, это не был бы длительный опрос).

Вы можете уменьшить время ожидания по умолчанию в 110 секунд во время запуска вашего приложения с помощью IConfigurationManager.ConnectionTimeout :

 // Make long polling connections wait a maximum of 60 seconds for a
// response. When that time expires, trigger a timeout command and
// make the client reconnect.
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(60);
  

http://www.asp.net/signalr/overview/signalr-20/hubs-api/handling-connection-lifetime-events#connectiontimeout