[英]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 的文档站点中提到了这一点:
要显示特定 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>"<%: 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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.