Определите w3wp System.Diagnostics.Process для данного пула приложений. - PullRequest
4 голосов
/ 29 января 2010

На моем сервере работает несколько веб-сайтов.

У меня есть страница "диагностики" в приложении, которая показывает объем памяти для текущего процесса (очень полезно).

Теперь это приложение «связано» с другим приложением, и я хочу, чтобы на моей странице диагностики отображался объем памяти для другого процесса w3wp.

Чтобы получить объем памяти, я использую простой код:

var process = Process.GetProcessesByName("w3wp");
string memory = this.ToMemoryString(process.WorkingSet64);

Как мне определить мой второй процесс w3wp, зная его пул приложений?

Я нашел соответствующую ветку, но не нашел подходящего ответа: Надежный способ просмотра статистики производительности процесса в пуле приложений IIS6

Спасибо

Ответы [ 2 ]

6 голосов
/ 29 января 2010

Вы можете использовать WMI , чтобы определить, к какому пулу приложений принадлежит данный w3wp.exe процесс:

var scope = new ManagementScope(@"\\YOURSERVER\root\cimv2");
var query = new SelectQuery("SELECT * FROM Win32_Process where Name = 'w3wp.exe'");
using (var searcher = new ManagementObjectSearcher(scope, query))
{
    foreach (ManagementObject process in searcher.Get())
    {
        var commandLine = process["CommandLine"].ToString();
        var pid = process["ProcessId"].ToString();
        // This will print the command line which will look something like that:
        // c:\windows\system32\inetsrv\w3wp.exe -a \\.\pipe\iisipm49f1522c-f73a-4375-9236-0d63fb4ecfce -t 20 -ap "NAME_OF_THE_APP_POOL"
        Console.WriteLine("{0} - {1}", pid, commandLine);
    }
}
5 голосов
/ 19 июля 2013

Вы также можете получить PID с помощью компонента IIS ServerManager; Кстати, если вам нужен доступ к нему в коде, без перенаправления и парсинга вывода консоли;

public static int GetIISProcessID(string appPoolName)
{
    Microsoft.Web.Administration.ServerManager serverManager = new   
        Microsoft.Web.Administration.ServerManager();
    foreach (WorkerProcess workerProcess in serverManager.WorkerProcesses)
    {
        if (workerProcess.AppPoolName.Equals(appPoolName))
            return workerProcess.ProcessId;
    }

    return 0;
}
...