首页 > 解决方案 > IIS 回收应用程序池时如何保持 Blazor 服务器连接处于活动状态

问题描述

我正在为我的客户构建 Blazor Server Intranet 应用程序。其中一项要求是他们可以无限期地保持登录状态。如果他们在周五下午开始输入一些数据,他们应该能够在周一早上返回并继续工作而不会中断。

我观察到客户端大约每天一次与服务器断开连接。发生这种情况时,我会看到可怕的 Blazor 错误“重新连接失败。如果无法重新连接,请尝试重新加载页面。”。如果我单击重新加载的链接,它会立即重新连接到我的服务器,但任何正在进行的工作都会丢失。

我找到了根本原因:默认情况下,IIS 每 29 小时回收一次应用程序池。发生这种情况时,Blazor SignalR 连接会中断,因此在浏览器中运行的代码会超时并断开连接。

我可以通过完全禁用应用程序池回收来解决这个问题。到目前为止,看起来效果很好(我可以在过去 3 天内保持连接)。但我担心从长远来看这可能不安全,因为应用程序池回收有助于处理内存泄漏、碎片等问题。

所以,我的问题是:是否可以配置 IIS,以便我可以回收应用程序池并在回收期间保持我的 blazor 服务器连接可用?

标签: iisblazorblazor-server-side

解决方案


当您回收应用程序池时,HTTP.SYS 在内核模式下保持客户端连接,而用户模式工作进程回收。进程回收后,HTTP.SYS 透明地将新请求路由到新的工作进程。因此,客户端永远不会“丢失所有连接”到服务器 - TCP 连接永远不会丢失 - 并且永远不会注意到进程循环。

我相信您的问题在于应用程序池中运行的应用程序在进程中存储状态,例如用户是否登录。每次流程回收时,该状态都会自动丢失……这是设计使然,因为这是流程回收所完成的。结果,您的用户“失去所有连接”并且“必须重新登录到他们的应用程序”以重新建立丢失的状态。解决此问题的唯一方法是让您的应用程序将其状态存储在 IIS 工作进程之外,以便它易于回收。

以下博客条目更多地讨论了正在发生的事情:

https://docs.microsoft.com/en-us/archive/blogs/david.wang/why-do-i-lose-asp-session-state-on-iis6


推荐阅读