我目前在 Server 2008 R2 上的负载平衡 IIS 集群 (NLB) 中有一个应用程序。此应用程序利用了一些遗留的数据库访问代码,这些代码偶尔会失败以禁用应用程序池。
我想放置一个 WMI 事件观察器来监视应用程序池状态的变化(欢迎其他建议),如果它进入停止状态,它将重新启动应用程序池。
这是在可以推送新代码之前的临时解决方法,但这必须经过 Dev/QA/UAT 周期。
在 root\webadministration 命名空间中有一个用于 ApplicationPool 的 WMI 类,但是要获取状态,您必须对该对象调用 GetState 方法,所以我不确定如何使用 WMI 事件来观察它。
您可以使用内置的事件日志监控来执行此操作。
如果应用程序池由于快速故障保护而关闭,系统事件日志中可能有一个事件 ID 5002,如下所示:
“由于为该应用程序池服务的进程中的一系列故障,应用程序池‘AppPoolName’被自动禁用。”
为自定义事件日志触发器创建计划任务。手动 XML 查询看起来像这样:
您的计划任务操作可能是运行一个脚本,该脚本运行 appcmd 以重新启动特定的应用程序池。
如果同一台服务器上有多个应用程序池,您可能需要优化 XML 过滤器以指定应用程序池 ID。以下是示例事件 XML 文本:
有关事件日志高级过滤的信息:
https ://blogs.technet.com/b/askds/archive/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer.aspx
使用 APPCMD 回收应用程序池:
http ://technet.microsoft.com/en-us/library/cc770764%28v=ws.10%29.aspx
仅供参考,如果由于快速故障转移保护而失败,您可以禁用它而不是小心翼翼地绕过它:
https://stackoverflow.com/a/4802309/448129