确定 ELMAH 是否已启用?

4

我如何通过程序确定 ELMAH 是否已启用?


你能解释一下你的问题吗?就目前而言,它对我来说没有意义。 - Mitch Wheat
当然可以。我会将ELMAH与产品一起发布,但是启用或禁用它(在web.config中)是客户的决定。我需要知道,在页面加载时,它是否已启用。我很乐意回答任何问题。 - lance
你不能只读取相关的 web.config 部分吗? - Mitch Wheat
我考虑过这个,但是我希望能有其他的选择,特别是考虑到告诉你它是否启用的web.config部分在从IIS6到IIS7的变化。例如,也许有一些可以为给定路径提供处理程序的编程可见性的东西... - lance
3个回答

2
您可以枚举所有已加载的模块(通过HttpApplication.Modules),并检查是否存在Elmah模块,如果存在,则表示Elmah已启用:


foreach (var m in Application.Modules) {
  if (m is Elmah.ErrorlogModule) {
   // ...
  }
}

不确定。尚未尝试过。


我尝试过这个,但是Application.Modules不可用(我尝试已经有一段时间了--我可能记错了细节,但我无法实现它)。你有实际使用的代码吗? - lance

1

因为:

ELMAH可以动态地添加到正在运行的ASP.NET Web应用程序,甚至是机器上的所有ASP.NET Web应用程序,而无需重新编译或重新部署。

所以您不需要检测它是否存在。只需编写记录代码,就好像它已经存在一样,如果不存在,则不会记录任何内容。

感兴趣吗?:如何让ELMAH与ASP.NET MVC [HandleError]属性一起工作?(接受答案的人是ELMAH的作者)


我需要展示一个指向 elmah.axd 的链接。如果它被禁用了,我就不想展示这个链接。 - lance
1
你能否对elmah.axd进行网络请求并检查状态码?也许可以这样做一次,并将结果存储在Application变量中以备将来使用。 - Greg
@Greg:我希望避免那种开销。你的解决方案是我到目前为止编写的代码,因为这是我能想到的最好的方法。我将尝试查看已加载模块列表,根据 Tadas 上面的答案。 - lance

0

根据Tadas的回答,我想出了以下代码,适用于我(请注意,我已经将其从VB翻译过来,但没有检查它是否可以编译,所以可能会有所不同):

bool foundElmah = false;

foreach (var m in HttpContext.Current.ApplicationInstance.Modules) {
    var module = HttpContext.Current.ApplicationInstance.Modules.Item(m);
    if (module is Elmah.ErrorLogModule || module is Elmah.ErrorMailModule || module is Elmah.ErrorFilterModule || module is Elmah.ErrorTweetModule) {
        foundElmah = true;
        break;
    }
}

if (foundElmah) {
    // do something here, like populate the application cache so you don't have to run this code every time
    return true;
} else {
    // store in application cache, etc.
    return false;
}

这也解决了我在请求elmah.axd时遇到的401响应问题(我使用的是Windows身份验证),而且速度更快,不会假定elmah.axd的特定位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接