我想从我的ASP.NET应用程序中检索“ASP.NET应用程序”类别的一些性能计数器. 我的问题是,我不知道如何为我当前运行的ASP.NET应用程序确定正确的实例名称. 我目前使用此代码: string in
我的问题是,我不知道如何为我当前运行的ASP.NET应用程序确定正确的实例名称.
我目前使用此代码:
string instanceName = GetCurrentProcessInstanceName(); _perfCounters.Add(new PerformanceCounter("ASP.NET", "Application Restarts")); _perfCounters.Add(new PerformanceCounter("ASP.NET Applications", "Pipeline Instance Count", instanceName)); _perfCounters.Add(new PerformanceCounter("ASP.NET Applications", "Requests Executing", instanceName)); _perfCounters.Add(new PerformanceCounter("ASP.NET Applications", "Requests/Sec", instanceName)); _perfCounters.Add(new PerformanceCounter("ASP.NET Applications", "Requests Failed", instanceName));
对于GetCurrentProcessInstanceName,我根据在intertubes上找到的信息和代码片段定义了这些辅助方法:
private static string GetCurrentProcessInstanceName() { return GetProcessInstanceName(GetCurrentProcessId()); } private static int GetCurrentProcessId() { return Process.GetCurrentProcess().Id; } private static string GetProcessInstanceName(int pid) { PerformanceCounterCategory cat = new PerformanceCounterCategory("Process"); string[] instances = cat.GetInstanceNames(); foreach (string instance in instances) { using (PerformanceCounter cnt = new PerformanceCounter("Process", "ID Process", instance, true)) { int val = (int) cnt.RawValue; if (val == pid) { return instance; } } } return null; }
现在的问题是,我收到以下错误:
实例’w3wp’在指定的类别中不存在.
很明显,代码片段不会为当前应用程序返回正确的实例ID.
我的问题是:我如何确定(可靠)正确的值?
附加信息:
由于我了解到最初应该创建一个性能计数器对象并重新使用此实例(而不是在每次需要时创建此对象)我在应用程序启动时启动单例.出于这个原因,我无法访问当前的HttpRequest,因为这发生在请求到达应用程序之前.
string curentWebApplicationInstanceName = System.Web.Hosting.HostingEnvironment.ApplicationID.Replace('/', '_');