繁体   English   中英

查找最终/有效的 web.config 值(来自继承的配置)

[英]Finding final/effective web.config values (from inherited configurations)

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

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

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

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

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

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

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

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

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

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

(晚了十年……)

另一种选择是运行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

其中<URL>是应该读取有效配置的配置路径,例如"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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM