如何检索当前asp.net应用程序的性能计数器

时间:2012-07-04 15:41:21

标签: asp.net performancecounter

我想为“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,因为这是在请求到达应用程序之前发生的。

1 个答案:

答案 0 :(得分:4)

我找到了解决方案,而且非常简单:

string curentWebApplicationInstanceName = System.Web.Hosting.HostingEnvironment.ApplicationID.Replace('/', '_');