如何使用C# .NET检测IIS应用程序池重启与崩溃并生成告警
检测IIS应用池崩溃可用的C# .NET相关类库/包
1. System.Diagnostics.EventLog(原生内置)
- 支持.NET Framework、.NET Core 3.0+、.NET 5+所有版本,无需额外安装NuGet包
- 可直接监听Windows系统事件日志,IIS应用池崩溃、异常停止时,Windows进程激活服务(WAS)会在
System日志通道生成事件ID为5002、5010、5011的错误记录,匹配对应事件即可触发告警 - 参考代码示例:
// 监听系统日志中WAS来源的事件 var eventLog = new EventLog("System", Environment.MachineName, "WAS"); eventLog.EntryWritten += (sender, e) => { // 筛选应用池崩溃相关事件ID if (e.Entry.InstanceId is 5002 or 5010 or 5011) { // 从日志信息中提取崩溃的应用池名称,执行告警逻辑 Console.WriteLine($"检测到应用池异常:{e.Entry.Message}"); } }; eventLog.EnableRaisingEvents = true;
2. Microsoft.Web.Administration(官方IIS管理包)
- 微软官方推出的IIS管理类库,需从NuGet源安装对应版本的包
- 除了可以配合事件日志做被动监听外,还支持主动轮询指定应用池的运行状态,可覆盖事件日志漏报的场景
- 参考代码示例:
using Microsoft.Web.Administration; // 主动拉取所有应用池运行状态 using var serverManager = new ServerManager(); foreach (var pool in serverManager.ApplicationPools) { // 仅检测你指定的需要监控的应用池 if (pool.Name == "你的目标应用池名称" && pool.State == ObjectState.Stopped) { // 执行告警、自动重启等逻辑 Console.WriteLine($"应用池{pool.Name}已异常停止"); } }
3. System.Diagnostics.PerformanceCounter(原生内置)
- .NET原生提供的性能计数器访问类库,无需额外安装包
- 可通过监控
W3SVC_W3WP分类下的工作进程相关计数器,判断应用池对应的w3wp进程是否意外退出,适配部分自定义配置下事件日志不记录崩溃的场景
注意:服务运行的账号需要授予事件日志读取、IIS管理访问的权限,否则会出现权限不足导致的读取失败问题。
内容的提问来源于stack exchange,提问作者Ankur
相关产品推荐
相关产品推荐

