2010-01-29 4 views
4

J'ai quelques sites Web en cours d'exécution sur mon serveur.Identification du système System.Diagnostics.w3wp pour un pool d'applications donné

J'ai une page de "diagnostic" dans une application qui montre le quantité de mémoire pour le processus en cours (très utile).

Maintenant, cette application est 'liée' à une autre application, et je veux que ma page de diagnostic puisse afficher l'amot de la mémoire pour un autre processus w3wp.

Pour obtenir la quantité de mémoire, utiliser un code simple:

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

Comment puis-je identifier mon deuxième processus w3wp, connaître son pool d'applications?

Je trouve un filetage correspondant, mais pas de réponse appropriée: Reliable way to see process-specific perf statistics on an IIS6 app pool

Merci

Répondre

6

Vous pouvez utiliser WMI pour identifier auquel le pool d'applications un processus w3wp.exe donné appartient:

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

Vous peut également obtenir le PID en utilisant le composant IIS ServerManager; façon, si vous avez besoin d'y accéder dans le code, sans rediriger et analyser la sortie de la console;

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

C'est comme ça! – Drutten

Questions connexes