2010-08-24 107 views
8

如何获取web.config中<system.webServer><httpErrors>元素中设置的errorMode属性的值?以编程方式检查httpErrors errorMode

我试图在ASP.NET Web应用程序中实现一些“自我诊断”。当应用程序启动时,它将运行web.config中的一些设置并确认它们设置正确。

尽管此代码的工作相当不错,当errormode在<system.web><customErrors>元素设置,

var errSec = (CustomErrorsSection)HttpContext.Current.GetSection("system.web/customErrors"); 
Response.Write(errSec.Mode.ToString()); 

一旦网站被部署在IIS7和这个配置现在是在system.webServer -> httpErrors发现它不会工作。

这是行不通的:

var errSec = (CustomErrorsSection)HttpContext.Current.GetSection("system.webServer/httpErrors"); 

并强制转换为CustomErrorsSection也似乎是一个坏主意,必须有一个更好的类型使用?

我在IIS.NET上发现了这篇文章,HTTP Errors,但我希望在不依赖于Microsoft.Web.Administration库的情况下这样做。

有什么建议?

UPDATE

好吧,基于下面的建议,我尝试这样做:

var errSec = (ConfigurationSection)HttpContext.Current.GetSection("system.webServer/httpErrors"); 
Response.Write(errSec.SectionInformation.GetRawXml().ToString()); 

但是,这也不行,该errSec对象为null。另外,如果我使用相同的方法加载<system.web><customErrors>部分,则GetRawXml()方法调用会失败,并显示“此操作在运行时不适用”。异常消息。

我知道如何加载整个web.config作为一个XML文件,并查询到我需要的元素。但在我看来,似乎必须有一个更优雅的方法。

如何读取web.config中的XML:

var conf = XDocument.Load(System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath + "web.config"); 
var errMode = conf.Root.Element("system.webServer").Element("httpErrors").Attribute("errorMode").Value; 

...但是这只是讨厌!如果errorMode设置在machine.config中设置或类似,它将不起作用。

回答

0

(CustomErrorsSection)HttpContext.Current.GetSection("system.webServer/httpErrors")不会工作,因为该部分是从IIS7配置schema和不一样CustomErrorsSection(从ASP.NET配置)。 如果你不想依赖于IIS7程序集(你不应该),唯一的办法就是使用ConfigurationSection对象来通过它的子元素进行枚举并得到你想要的。或者你可以直接拿起配置文件,将其视为XML并读取必要的值。

+0

您可以随时使用反射;-) – Steven 2010-08-24 10:30:56

+0

是的,我忘了提及“read as xml”方法作为我想避免的另一个选项。 :)我试图加载它作为ConfigurationSection,但我无法弄清楚如何到达errorMode属性。有任何想法吗? – 2010-08-24 11:04:27