是否有任何应用可以显示应用于特定应用程序目录的最终配置?我想象的是FireBug的CSS查看器。
基本上,它应该显示等效的单个web.config文件(就好像你只有一个),包含适用于相关目录的所有值,每个元素(甚至属性)都用其源代码注释(真正的.config文件来自)。
这将极大地帮助将应用程序部署到外部环境(例如,客户站点),在那里他们有时会有奇怪的配置,添加全局包含(例如,他们将include包含在machine.config中,而不是web.config中应用)或allowOverride = false等
答案 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的文档站点中提到:
要显示特定网址级别的有效配置,请使用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>"<%: appCmdPath2 %>" <%: 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>