我正在为我的客户构建Blazor Server intranet应用程序。其中一个要求是他们可以无限期地保持登录状态。如果他们在周五下午开始输入一些数据,他们应该能够在周一早上返回并继续工作,不会受到干扰。
我观察到客户端每天大约有一次与服务器断开连接。当这种情况发生时,我会看到可怕的Blazor错误"重新连接失败。如果无法重新连接,请尝试重新加载页面。"。如果我单击"重新加载"链接,它会立即重新连接到我的服务器,但任何正在进行的工作都会丢失。
我发现了根本原因:默认情况下,IIS每29小时回收一次应用程序池。当这种情况发生时,Blazor SignalR连接被中断,因此浏览器中运行的代码超时并断开连接。
我可以通过完全禁用应用程序池回收来解决这个问题。到目前为止,这看起来很好(我可以在过去3天内保持连接(。但我担心,从长远来看,这可能不安全,因为应用程序池回收有助于处理内存泄漏、碎片等问题。
所以,我的问题是:是否可以配置IIS,以便我可以回收应用程序池,并在回收期间保持我的blazor服务器连接可用?
当您回收应用程序池时,HTTP。SYS在内核模式下保持客户端连接,而用户模式工作进程进行回收。流程回收后,HTTP。SYS透明地将新请求路由到新的工作进程。因此,客户永远不会";失去所有连接";到服务器-TCP连接从未丢失-并且从未注意到进程回收。
我认为您的问题在于应用程序池中运行的应用程序在进程中存储状态,例如用户是否登录。每次流程回收时,该状态都会自动丢失。。。这是经过设计的,因为这是工艺循环所完成的。因此,您的用户";失去所有连接";以及";必须重新登录到他们的应用程序中";重新建立失去的状态。解决此问题的唯一方法是,您的应用程序将其状态存储在IIS工作进程之外,以便于回收。
以下博客文章详细介绍了正在发生的事情:
https://learn.microsoft.com/en-us/archive/blogs/david.wang/why-do-i-lose-asp-session-state-on-iis6