【发布时间】:2023-03-03 23:13:01
【问题描述】:
我正在为我的客户构建 Blazor Server Intranet 应用程序。其中一项要求是他们可以无限期地保持登录状态。如果他们在周五下午开始输入一些数据,他们应该能够在周一早上返回并继续工作而不会中断。
我发现客户端每天大约断开一次与服务器的连接。发生这种情况时,我会看到可怕的 Blazor 错误“重新连接失败。如果无法重新连接,请尝试重新加载页面。”。如果我单击重新加载链接,它会立即重新连接到我的服务器,但任何正在进行的工作都会丢失。
我找到了根本原因:默认情况下,IIS 每 29 小时回收一次应用程序池。发生这种情况时,Blazor SignalR 连接会中断,因此在浏览器中运行的代码会超时并断开连接。
我可以通过完全禁用应用程序池回收来解决此问题。到目前为止,看起来效果很好(我可以在过去 3 天内保持连接)。但我担心从长远来看这可能不安全,因为应用程序池回收有助于处理内存泄漏、碎片等问题。
所以,我的问题是:是否可以配置 IIS,以便我可以回收应用程序池并在回收期间保持我的 blazor 服务器连接可用?
【问题讨论】:
-
您要么禁用 IIS 应用程序池回收,要么接受以这种方式重置连接的事实。这也是微软开发 Blazor WebAssembly 的原因,它不会以同样的方式中断。
-
嗨,shanabus,感谢您的链接。它确实提供了更多信息,但似乎并没有完全解决这个问题。当应用程序池回收时,我似乎将丢失保存在服务器上的所有应用程序数据。除非我可以在回收之前将其保存到磁盘或数据库中,然后在新池启动时重新加载。
-
如果你想在两次刷新之间保留状态(这似乎真的归结为),我建议使用会话存储。当您加载页面或组件时,请检查会话存储中是否存在适当的数据并从中初始化您的对象和变量。您必须确保根据需要清除会话存储。
-
嗨 Lex,实际上这里有两个问题:1)我不希望我的用户正在进行的工作在应用程序回收期间丢失,2)我想保留一些用户数据。在我的应用程序中,我将敏感的用户数据存储在服务器端,并且不想将其放入浏览器端会话存储中。
标签: iis blazor blazor-server-side