IIS 上的 Blazor 服务器端应用程序经常断开 WebSocket 连接

Ren*_*ené 6 iis websocket blazor blazor-server-side

我有一个在 IIS 10 上发布的 Blazor 服务器端应用程序。当浏览到任意页面并在一分钟左右(有时只有 45 秒,有时在 1 到 2 分钟之间)后让它空闲时,模态

正在尝试重新连接到服务器...

出现几秒钟。在浏览器控制台中,日志显示

错误:连接因错误“错误:服务器超时而未收到来自服务器的消息而断开连接。”。

或者

信息:连接已断开。

由于这似乎是一个超时问题,因此我在startup.cs 中ConfigureServices添加了以下选项

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

但这并不能解决问题。

我还转到了 IIS 中站点的高级设置,并将连接超时从默认的 120 秒增加到 600 秒。这也没有帮助。

这些频繁断开连接仅发生在 IIS 10 上托管的实时站点上。如果我使用 Visual Studio 在本地启动应用程序,则连接是稳定的。

我所缺少的任何提示将不胜感激!

更新

正如@agua from mars 在下面的评论中所建议的那样,我更改了这样的传输类型

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

通过此更改,连接仍处于关闭状态。控制台日志显示

信息:(LongPolling 传输)轮询被服务器终止。

我也试过HttpTransportType.ServerSentEvents,它根本不起作用,但给出了这个错误

错误:无法启动连接:错误:无法使用任何可用传输连接到服务器。ServerSentEvents 失败:错误:“ServerSentEvents”不支持二进制。

更新 2:

IIS 配置为使用 HTTP 1.1 我尝试更改为 HTTP/2 但这并没有改变任何关于断开连接的内容。

小智 8

IIS这与@Programmer所述的应用程序池回收有关。您可以通过进入应用程序池来重现此情况,右键单击该池并选择回收以强制它。您的 blazor 应用程序将获得“重新连接模式屏幕”。

对我来说,我不想禁用池回收,所以我js_Hosts.cshtml文件中添加为

<script>Blazor.defaultReconnectionHandler._reconnectCallback = function (d) {document.location.reload();}</script>
Run Code Online (Sandbox Code Playgroud)

当服务器恢复时自动重新连接。


小智 6

试试这个..

            app.UseEndpoints(endpoints =>
            {
//other settings
.
.
endpoints.MapBlazorHub(options => options.WebSockets.CloseTimeout = new TimeSpan(1, 1, 1));
//other settings
.
.
});
Run Code Online (Sandbox Code Playgroud)