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

时间:2010-04-25 18:08:03

标签: asp.net iis web-config

是否有任何应用可以显示应用于特定应用程序目录的最终配置?我想象的是FireBug的CSS查看器。

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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

(晚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

要显示特定网址级别的有效配置,请使用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>