我想从我的 ASP.NET 应用程序中检索“ASP.NET 应用程序”类别的一些性能计数器。
我的问题是,我不知道如何为当前正在运行的 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,因为这发生在请求到达应用程序之前。