如何在IIS10托管的ASP.NET站点后台获取站点/应用池运行时长?
获取IIS 10中ASP.NET站点对应应用池的运行时长
站点的运行时长确实等同于对应应用池的运行时长,以下是几种无需第三方工具、可在ASP.NET后台代码中直接调用的方法:
方法一:通过当前进程直接获取(最简单)
当前ASP.NET站点运行在对应的w3wp.exe进程中,该进程的启动时间就是应用池的启动时间,直接计算当前时间与进程启动时间的差值即可:
using System; using System.Diagnostics; public TimeSpan GetAppPoolUptime() { var currentProcess = Process.GetCurrentProcess(); return DateTime.Now - currentProcess.StartTime; }
此方法无需额外引用程序集,也不需要特殊权限,适合大多数场景。
方法二:使用Microsoft.Web.Administration库
通过IIS管理库定位目标应用池,读取其工作进程的启动时间:
- 引用
Microsoft.Web.Administration.dll(通常位于C:\Windows\System32\inetsrv目录) - 编写代码:
using Microsoft.Web.Administration; using System; public TimeSpan GetAppPoolUptimeByServerManager() { // 动态获取当前站点所属的应用池名称 string currentAppPoolName = System.Web.Hosting.HostingEnvironment.ApplicationPoolName; using (var serverManager = new ServerManager()) { var appPool = serverManager.ApplicationPools[currentAppPoolName]; if (appPool != null && appPool.WorkerProcesses.Count > 0) { var workerProcess = appPool.WorkerProcesses[0]; return DateTime.Now - workerProcess.StartTime; } return TimeSpan.Zero; } }
注意:此方法需要应用池身份具备读取IIS配置的权限,若权限不足会抛出异常。
方法三:通过WMI查询
利用IIS暴露的WMI接口查询应用池信息:
- 引用
System.Management程序集 - 编写代码:
using System; using System.Management; public TimeSpan GetAppPoolUptimeByWmi() { string appPoolName = System.Web.Hosting.HostingEnvironment.ApplicationPoolName; TimeSpan uptime = TimeSpan.Zero; try { var scope = new ManagementScope(@"root\WebAdministration"); scope.Connect(); var query = new ObjectQuery($"SELECT * FROM ApplicationPool WHERE Name = '{appPoolName}'"); using (var searcher = new ManagementObjectSearcher(scope, query)) { foreach (ManagementObject obj in searcher.Get()) { DateTime startTime = ManagementDateTimeConverter.ToDateTime(obj["StartTime"].ToString()); uptime = DateTime.Now - startTime; break; } } } catch (Exception ex) { // 根据实际情况处理异常(如权限不足、WMI服务未启动等) } return uptime; }
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

