Карта AppDomain в понятное имя с использованием C # - PullRequest
3 голосов
/ 29 мая 2019

Итак, у меня есть веб-сервер IIS10, на котором запущено довольно много приложений, таких как:

 + Default Web Site
     -First Application
     -Second Application
     -Third Application

Мы используем nLog для записи данных в базу данных, одним из которых является текущий домен приложения

${appdomain:format=Format}

как задокументировано на https://github.com/NLog/NLog/wiki/AppDomain-Layout-Renderer.

Это замечательно, за исключением того, что когда я смотрю наши консолидированные журналы, я вижу, что домен приложения зарегистрирован как:

0002: / LM / W3SVC / 2 / ROOT-1-132036049222959352

Я хочу перевести это в «Третье приложение» (поэтому, когда я создаю отчет, он будет отображаться как «Третье приложение»"вместо 0002: / LM / W3SVC / 2 / ROOT-1-132036049222959352.)

Условия:

  • Я не могу изменить компоновщик вывода.
  • Я не могу изменить код приложений.
  • Я должен сделать это ПОСЛЕ записи данных.Я предполагаю, что / LM / W3SVC / 2 / ROOT - это то, что мне нужно преобразовать, и я не могу сделать это в приложении, только в отчетах.

Я пробовал Microsoft.Web.Администрация, что-то вроде:

using (ServerManager sm = new ServerManager()){
                var thisVal = (from s in sm.Sites
                               from app in s.Applications
                               from vDir in app.VirtualDirectories
                               where vDir.Path.Equals(currVal,StringComparison.InvariantCultureIgnoreCase)
                               select new KeyValuePair<string, string>(currVal, vDir.Path));
}

Но я нигде не могу найти корень приложения там.Я полагаю, что это то же самое, что и https://docs.microsoft.com/en-us/previous-versions/iis/6.0-sdk/ms524308(v=vs.90),, но это метабаза IIS, которая, по-видимому, старая и сломанная.

(приведенный выше код будет работать на той же машине, что и приложения, поэтому мне не нужно беспокоиться о поиске правильного сервера, просто переведя имя)

1 Ответ

1 голос
/ 13 июня 2019

Вы можете перечислить (и, следовательно, отфильтровать) идентификатор AppDomain следующим образом:

        using (ServerManager s = new ServerManager())
        {
            var processList = from m in Process.GetProcessesByName("w3wp") select m.Id;

            IEnumerable<WorkerProcess> workerP = (from p in s.ApplicationPools
                                                  from w in p.WorkerProcesses
                                                  where processList.Any(vn => vn == w.ProcessId)
                                                  select w);


            foreach (var workProcess in workerP)
            {
                Console.WriteLine(
                    $"{workProcess.AppPoolName} Id:{workProcess.ProcessId} AppDomains Count: {workProcess.ApplicationDomains?.Count}");
                var ad = workProcess.ApplicationDomains;
                if (!ad.Any()) continue;
                foreach (var curDomain in ad)
                {
                    Console.WriteLine($"AppDomain: {curDomain.Id} {curDomain.VirtualPath}");
                }
            }
        }

Это даст вам вывод, который показывает идентификаторы AppDomain, из которого вы можете получить vdir:

DefaultAppPool Id:33180 AppDomains Count: 1
AppDomain: /LM/W3SVC/1/ROOT/
...