4

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の場合、インターチューブで見つけた情報とコードスニペットからこれらのヘルパーメソッドを定義しました。

    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にアクセスできません。これは、リクエストがアプリケーションにヒットする前に発生するためです。

4

1 に答える 1

4

私は解決策を見つけました、そしてそれは非常に簡単です:

string curentWebApplicationInstanceName = System.Web.Hosting.HostingEnvironment.ApplicationID.Replace('/', '_');
于 2012-07-12T09:14:57.533 に答える