iis - IIS 回收应用程序池时如何保持 Blazor 服务器连接处于活动状态
问题描述
我正在为我的客户构建 Blazor Server Intranet 应用程序。其中一项要求是他们可以无限期地保持登录状态。如果他们在周五下午开始输入一些数据,他们应该能够在周一早上返回并继续工作而不会中断。
我观察到客户端大约每天一次与服务器断开连接。发生这种情况时,我会看到可怕的 Blazor 错误“重新连接失败。如果无法重新连接,请尝试重新加载页面。”。如果我单击重新加载的链接,它会立即重新连接到我的服务器,但任何正在进行的工作都会丢失。
我找到了根本原因:默认情况下,IIS 每 29 小时回收一次应用程序池。发生这种情况时,Blazor SignalR 连接会中断,因此在浏览器中运行的代码会超时并断开连接。
我可以通过完全禁用应用程序池回收来解决这个问题。到目前为止,看起来效果很好(我可以在过去 3 天内保持连接)。但我担心从长远来看这可能不安全,因为应用程序池回收有助于处理内存泄漏、碎片等问题。
所以,我的问题是:是否可以配置 IIS,以便我可以回收应用程序池并在回收期间保持我的 blazor 服务器连接可用?
解决方案
当您回收应用程序池时,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
推荐阅读
- javascript - 2018 年 Safari 9 中的箭头功能有问题吗?
- azure - 当您无法将确切的排队消息出队时,QueueTriggerAttribute 有什么好处?或者你可以吗?
- node.js - node.js 应用程序无法在 appengine 中部署:gcloud 应用程序部署到 appengine 失败,缓存的基础映像和节点缓存出现问题
- excel - 嵌套循环导致 Excel 崩溃
- ios - 你能解释一下 Swift 中的“receiver”和“view - superview”吗?
- amazon-s3 - 如何将数据从 Amazon SQS 流式传输到 Amazon S3 中的文件
- git - 在 Git 预接收挂钩中,有没有办法获取存储库来源详细信息,例如组织和存储库名称?
- android - Gradle 插件或任何使用选定工件打包 jar 文件的解决方案
- javascript - 如何在引导模式中传递多个数据 ID
- sql - 添加 if/else 过滤器