Приложение Blazor на стороне сервера в IIS часто отключает соединение WebSocket

У меня есть приложение на стороне сервера Blazor, опубликованное в IIS 10. Когда вы просматриваете произвольную страницу и просто позволяете ей бездействовать через минуту или около того (иногда всего 45 секунд, иногда что-то между 1 и двумя минутами) модальный

Попытка повторно подключиться к серверу ...

появляется на пару секунд. В консоли браузера в журнале отображается либо

Ошибка: соединение прервано с ошибкой «Ошибка: истекло время ожидания сервера без получения сообщения от сервера.».

or

Информация: Соединение прервано.

Поскольку кажется, что это проблема с тайм-аутом, я добавил следующие параметры в ConfigureServices в моем startup.cs

services.AddServerSideBlazor()
                .AddHubOptions(options =>
                {
                    options.ClientTimeoutInterval = TimeSpan.FromMinutes(10);
                    options.KeepAliveInterval = TimeSpan.FromSeconds(3);
                    options.HandshakeTimeout = TimeSpan.FromMinutes(10);
                });

Однако это не решает проблемы.

Я также перешел к расширенным настройкам своего сайта в IIS и увеличил тайм-аут соединения со 120 секунд по умолчанию до 600 секунд. Это тоже не помогло.

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

Любые намеки на то, что мне не хватает, будут оценены!

Обновление:

Как было предложено @agua из марса в комментарии ниже, я изменил тип транспорта следующим образом

app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapBlazorHub(options => { options.Transports = HttpTransportType.LongPolling; });
                endpoints.MapFallbackToPage("/_Host");
            });

После этого изменения соединение по-прежнему закрыто. Журнал консоли показывает

Информация: (Транспорт LongPolling) Опрос завершен сервером.

Я также пробовал HttpTransportType.ServerSentEvents, который вообще не работает, но дает эту ошибку

Ошибка: не удалось запустить соединение: Ошибка: невозможно подключиться к серверу с помощью любого из доступных транспортов. Ошибка ServerSentEvents: ошибка: «ServerSentEvents» не поддерживает двоичные файлы.

Обновление 2:

IIS настроен на использование HTTP 1.1. Я попытался перейти на HTTP / 2, но это ничего не изменило в отношении отключений.


person René    schedule 04.02.2020    source источник
comment
Соединение может быть закрыто брандмауэром или прокси-сервером. Попробуйте перейти на другой транспорт.   -  person agua from mars    schedule 04.02.2020
comment
@agua from mars: типы транспорта LongPolling и ServerSentEvents также не работают (см. обновление вопроса).   -  person René    schedule 04.02.2020
comment
Хмм, я думаю, вам следует открыть проблему с репозиторием на github. Приложение должно попытаться восстановить соединение после потери соединения, и долгий пул должен работать.   -  person agua from mars    schedule 04.02.2020
comment
Тем не менее, у вас, вероятно, есть оборудование, закрывающее соединение. Или ваш сервер IIS настроен на использование HTTP 1.0   -  person agua from mars    schedule 04.02.2020
comment
@aguafrommars: он восстанавливает соединение после потери соединения (как для WebSocket, так и для LongPolling). Но я получаю жалобы от пользователей, потому что повторное подключение примерно каждую минуту делает его очень нестабильным. Я еще раз посмотрю на сервер IIS и прокси. Спасибо за ваши предложения!   -  person René    schedule 04.02.2020
comment
@aguafrommars: IIS настроен на использование HTTP 1.1. Я также пробовал HTTP / 2 (см. Обновление 2). Я предполагаю, что это оставляет доверенное лицо в качестве причины.   -  person René    schedule 04.02.2020
comment
попробуйте установить hubConnection.serverTimeoutInMilliseconds = 100000; // 100 секунд. для получения дополнительной информации вы можете обратиться к ссылке на github: github.com/aspnet/AspNetCore.Docs/issues / 6885   -  person Jalpa Panchal    schedule 05.02.2020
comment
@JalpaPanchal: Есть какие-нибудь подсказки о том, как установить hubConnection.serverTimeoutInMilliseconds в приложении Blazor? Он недоступен в AddServerSideBlazor (). AddHubOptions (), но также не в конечных точках.MapBlazorHub ().   -  person René    schedule 05.02.2020
comment
вы можете обратиться к этой ссылке для получения более подробной информации: ссылка   -  person Jalpa Panchal    schedule 13.02.2020
comment
@ Рене Я столкнулся с той же проблемой, ты ее решил?   -  person Kasper Roma    schedule 29.04.2020
comment
@KasperRoma Нет, я не решал. Но я заметил, что в последнее время проблема больше не возникает. Я только что попытался воспроизвести ошибку, но безуспешно. Я не знаю, что это решило. Я постоянно обновлял nuget-пакеты своего проекта, но не знаю, помогли ли какие-либо из этих обновлений. Еще одна вещь, которая отличается от того, что известно со времени, когда я задавал этот вопрос, заключается в том, что я уже несколько недель подключаюсь к веб-приложению через VPN-туннель (из-за corona homeoffice). Я не знаю, что это имеет какое-то влияние.   -  person René    schedule 11.05.2020


Ответы (2)


Попробуйте это ..

            app.UseEndpoints(endpoints =>
            {
//other settings
.
.
endpoints.MapBlazorHub(options => options.WebSockets.CloseTimeout = new TimeSpan(1, 1, 1));
//other settings
.
.
});
person Ganesh Kumbhar    schedule 05.04.2021
comment
Спасибо @ ganesh-kumbhar, это решает мою проблему - person Max Shlain; 24.05.2021

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

person Programmer    schedule 01.06.2021