Итак, у меня есть веб-сервер 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.)
Условия:
Я пробовал Microsoft.Web.Administration, например:
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, которая, по-видимому, устарела и повреждена.
(приведенный выше код будет работать на том же компьютере, что и приложения, поэтому мне не нужно беспокоиться о поиске правильного сервера, просто перевести имя)
Хотел бы я, чтобы это было так просто, но я ничего не могу сделать с приложениями, все, что я могу трогать, это данные в базе данных.
Вы уверены, что 0002:/LM/W3SVC/2/ROOT-1-132036049222959352
принадлежит Third Application
? Вместо этого должно быть что-то 0002:/LM/W3SVC/2/ROOT/Third Application-1-132036049222959352
.
Вы можете перечислить (и, таким образом, отфильтровать) идентификатор 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/
Ничего не знать о своей установке. Но если у вас 3 приложения. Тогда у вас, вероятно, есть 3 файла web.config. Почему бы просто не изменить web.config приложения 3, чтобы включить их индивидуальное «настоящее» имя?