【问题标题】:Map AppDomain into a friendly name using C#使用 C# 将 AppDomain 映射为友好名称
【发布时间】:2019-06-20 08:23:42
【问题描述】:

所以我有一个 IIS10 网络服务器,运行着很多应用程序,例如:

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

我们正在使用 nLog 将内容记录到数据库中,其中之一是当前的 appdomain

${appdomain:format=Format}

https://github.com/NLog/NLog/wiki/AppDomain-Layout-Renderer 中所述。

这很好,除了当我查看我们的合并日志时,我看到 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));
}

但我在任何地方都找不到应用程序根目录。我相信它和https://docs.microsoft.com/en-us/previous-versions/iis/6.0-sdk/ms524308(v=vs.90) 是一样的,但那是IIS 元数据库,它显然已经过时并且被破坏了。

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

【问题讨论】:

  • 对您的设置一无所知。但是,如果您有 3 个应用程序。那么你可能有 3 个 web.config。为什么不直接更改 3 个应用程序的 web.config 以包含它们各自的“真实”名称?
  • 我希望它这么简单——但我不能对应用程序做任何事情,数据库中的数据就是我能接触到的所有数据。
  • 您确定0002:/LM/W3SVC/2/ROOT-1-132036049222959352 属于Third Application 吗?它必须是0002:/LM/W3SVC/2/ROOT/Third Application-1-132036049222959352

标签: c# iis nlog


【解决方案1】:

您可以枚举(并因此过滤)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}");
                }
            }
        }

这将为您提供显示 AppDomain id 的输出,您可以从中获取 vdir:

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

【讨论】:

    猜你喜欢
    • 2020-07-28
    • 1970-01-01
    • 2016-05-15
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    相关资源
    最近更新 更多