2010-01-29 3 views
4

У меня появилось несколько веб-сайтов, работающих на моем сервере.Определите w3wp System.Diagnostics.Process для данного пула приложений

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

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

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

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

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

я нашел соответствующую нить, но не соответствующего ответа: Reliable way to see process-specific perf statistics on an IIS6 app pool

Благодарность

ответ

6

Вы можете использовать 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

You также может получить 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; 
} 
+0

Вот именно так! – Drutten