有一个 ASP.net Web 应用程序,它可以正常工作几天,但随后会随机抛出一些数据库连接字符串异常,结果表中列出了 0 条记录(应显示数百条)。我花了很多周的时间调试,内存很好,数据库存在并且通过做任何会导致应用程序回收的事情来修复它。甚至需要等待很多天才能繁殖。
所以我在想,既然我知道永远不应该有 0 条记录,我该如何强制运行 Web 应用程序的应用程序池进行回收(当我收到此数据库异常或 0 条记录时)。至少这样该网站将为下一个用户工作,而我不必手动重新启动它。
由于复杂性,我从未完全适应此解决方案,还因为安全要求不明确(如果您必须为此向应用程序用户授予权限,这不仅是另一个配置步骤,而且是安全性风险,而且似乎让应用程序用户有权不加选择地回收应用程序池,尤其是通过网络,可能会在 DOS 攻击中被利用)。
在我发现关键情况的有限情况下,我能够通过重新启动并在执行期间检测到这些情况,但还不能通过更可口的代码更改来防止,经过大量研究,我经历了其他几种解决方案(好的-- hacks ) 来完成这项工作。1. 在新生成的线程上抛出一个未处理的异常,2 Environment.Exit(). 和 3. System.Web.HttpRuntime.UnloadAppDomain(). 这些具有终止所有正在进行的请求的相当令人讨厌的副作用,这无疑是一个可怕的黑客,但在某些情况下是可以容忍的(例如发现的条件无论如何都会阻止对绝大多数请求的正确处理)。
多年来,我一直对这个 hack 感到厌恶,直到我最近偶然发现了这个更简单并且WMI完全避免的小宝石:
System.Web.Hosting.HostingEnvironment.InitiateShutdown();
Run Code Online (Sandbox Code Playgroud)
我的测试表明它完全符合我的需要,我相信这也是您想要的。根据文档,它一直存在.NET 2.0,但直到几天前我才在我的研究中遇到它。
| 归档时间: |
|
| 查看次数: |
8018 次 |
| 最近记录: |