C# 使用C将AppDomain映射为友好名称

C# 使用C将AppDomain映射为友好名称,c#,iis,nlog,C#,Iis,Nlog,因此,我有一个IIS10 Web服务器,运行许多应用程序,如: + Default Web Site -First Application -Second Application -Third Application 我们使用nLog将内容记录到数据库中,其中一个是当前的appdomain ${appdomain:format=format} 如在中记录的 这很好,但当我查看我们的合并日志时,我发现appdomain被记录为: 0002:/LM/W3SVC/2/

因此,我有一个IIS10 Web服务器,运行许多应用程序,如:

 + Default Web Site
     -First Application
     -Second Application
     -Third Application
我们使用nLog将内容记录到数据库中,其中一个是当前的appdomain

${appdomain:format=format}

如在中记录的

这很好,但当我查看我们的合并日志时,我发现appdomain被记录为:

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

我想将其转换为第三个应用程序,以便在创建报告时,它将显示为第三个应用程序,而不是0002:/LM/W3SVC/2/ROOT-1-132036049222959352

条件是:

我不能改变住宿安排。 我无法更改应用程序的代码。 我必须在记录完数据后再这样做。我假设/LM/W3SVC/2/ROOT是我需要转换的,我不能在应用程序中转换,只能在报告中。 我尝试过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));
}
但是我在任何地方都找不到应用程序根。我相信这与相同,但这是IIS元数据库,它显然已经过时了


上面的代码将与应用程序运行在同一台机器上,因此我不必担心找到正确的服务器,只需翻译名称即可

,您可以枚举并筛选AppDomain的id:

        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}");
                }
            }
        }

对你的设置一无所知。但是如果你有3个申请。那么您可能有3个web.config。为什么不直接更改3应用程序的web.config以包含其个人真实姓名?我希望这么简单-但我不能对这些应用程序做任何事情,数据库中的数据是我所能接触到的。您确定0002:/LM/W3SVC/2/ROOT-1-132036049222959352属于第三个应用程序吗?它必须是0002:/LM/W3SVC/2/ROOT/Third Application-1-132036049222959352。
DefaultAppPool Id:33180 AppDomains Count: 1
AppDomain: /LM/W3SVC/1/ROOT/