【问题标题】:Finding final/effective web.config values (from inherited configurations)查找最终/有效的 web.config 值(来自继承的配置)
【发布时间】:2010-04-25 18:08:03
【问题描述】:

是否有任何应用程序可以显示应用于特定应用程序目录的最终配置?我所描绘的是与 FireBug 的 CSS 查看器类似的东西。

基本上,它应该显示等效的单个 web.config 文件(就像您只有一个一样),其中包含适用于相关目录的所有值,每个元素(甚至属性)都用其源注释(它来自真实的 .config 文件)。

这将极大地帮助将应用程序部署到外部环境(例如,客户站点)中,在这些环境中,它们有时会有奇怪的配置,添加全局包含(例如,他们将包含放在 machine.config 中,而不是 web.config 中) app) 或有 allowOverride=false 等。

【问题讨论】:

    标签: asp.net iis web-config


    【解决方案1】:

    目前不存在公开的信息,但可以轻松编写查看器。我将分析 .NET CLR 关于配置继承和值确定的反射源。计算域最终配置的代码逻辑非常具体,因此当前不存在您的请求的查看器是有意义的,这对于您设想的查看器来说是一个很好的起点。

    关于使部署、比较和编辑配置文件更容易,我个人建议尝试ASPhere。它是目前最好的 .NET 配置文件 GUI 编辑器,虽然它不是开源的。

    当然,还有其他有用的示例读取/访问配置文件:

    对于部分也有特殊的例外,例如“processModel”设置。有关更多信息/概述详情,请参阅:

    【讨论】:

    • ASPhere 是打开一个文件,在这里询问会发生什么,包括在最后一个之前加载的所有 web.config。以及 web.config 如何共同制作最终在应用程序上使用的选项。
    【解决方案2】:

    如果您知道您感兴趣的配置部分,那么这将为您提供有效的设置作为专门针对这些设置的类。然后,您可以转换类型并以这种方式检索设置,并对您感兴趣的任何部分执行相同的操作。

    object vals = System.Configuration.ConfigurationManager.GetSection("AppSettings")
    

    但是,如果您想使用代码发现所有部分,我不知道有什么方法可以检索所有当前配置部分。

    【讨论】:

      【解决方案3】:

      (晚了 10 年……)

      另一个选项是运行appcmd.exe list config(您可以在您的 ASP.NET 进程中执行此操作),并提供选项以获得应用程序位置的有效配置。

      这在 IIS 的文档站点中有所提及:

      https://docs.microsoft.com/en-us/iis/get-started/getting-started-with-iis/getting-started-with-appcmdexe#working-with-configuration

      要显示特定 url 级别的有效配置,请使用 Config 对象的LIST 命令,如下所示:

      %systemroot%\system32\inetsrv\APPCMD list config <URL> /section:SectionName
      

      其中&lt;URL&gt;是应该读取有效配置的配置路径,例如"Default Web Site/""Default Web Site/app1/hello.html"。如果未指定,则默认为服务器级别。

      这是我使用的代码。这是一个单一的 .aspx 文件,您可以通过 FTP 启动并直接运行(假设您没有任何拦截对 .aspx 文件的请求)

      <%@ Page Language="C#" %>
      <%@ Import Namespace="System.IO" %>
      <%@ Import Namespace="System.Diagnostics" %>
      <%
      
          String iisWebsiteName = System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName();
          
          DirectoryInfo wwwroot = new DirectoryInfo( this.Server.MapPath( "~/" ) );
      
          String appCmdArgs;
          const Boolean isAzureAppService = false;
          if( isAzureAppService )
          {
              String applicationHostConfigName = String.Format( @"C:\DWASFiles\Sites\{0}\Config\applicationhost.config", iisWebsiteName );
              
              appCmdArgs = String.Format( "list config \"{0}\" /apphostconfig:\"{1}\"", iisWebsiteName, applicationHostConfigName );
          }
          else
          {
              appCmdArgs = String.Format( "list config \"{0}\"", iisWebsiteName );
          }
      
          const String appCmdPath1 = @"%systemroot%\system32\inetsrv\appcmd.exe";
          String       appCmdPath2 = Environment.ExpandEnvironmentVariables( appCmdPath1 );
         
          ProcessStartInfo psi = new ProcessStartInfo( appCmdPath2, appCmdArgs )
          {
            UseShellExecute        = false,
            RedirectStandardError  = true,
            RedirectStandardOutput = true,
            CreateNoWindow         = true
          };
          
          List<String> stderr = new List<String>();
          List<String> stdout = new List<String>();
          Int32 exitCode;
          
          using( Process p = new Process() )
          {
              p.StartInfo = psi;
              
              p.ErrorDataReceived += ( s, e ) => stderr.Add( e.Data );
              p.OutputDataReceived += ( s, e ) => stdout.Add( e.Data );
              
              p.Start();
              
              p.BeginErrorReadLine();
              p.BeginOutputReadLine();
              
              p.WaitForExit();
              
              exitCode = p.ExitCode;
          }
          
          String allErr = String.Join( "\r\n", stderr );
          String allOut = String.Join( "\r\n", stdout );
      
      %>
      
      <style type="text/css">
      pre { border: 1px inset #999; background-color: #eee; }
      </style>
      
      <p>IIS Website Name: <code><%: iisWebsiteName %></code></p>
      
      <p>Command: <code>&quot;<%: appCmdPath2 %>&quot; <%: args %></code></p>
      
      <h3>AppCmd.exe</h3>
      <p>Exit code: <%: exitCode %></p>
      
      <h3>Standard Error</h3>
      <pre><%: allErr %></pre>
      
      <h3>Standard Output</h3>
      <pre><%: allOut %></pre>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-03
        • 2012-02-06
        • 2016-09-29
        • 2023-02-02
        • 2010-12-10
        • 2010-09-26
        相关资源
        最近更新 更多