我正在尝试创建一个可用性页面来检查站点使用的所有服务,将每个检查包装在 try/catch 中,然后向用户显示任何故障。其中一项服务是 ELMAH,所以我调用它是为了仔细检查我们是否可以成功记录错误。
控制器:
var a = new AvailabilityModel();
try {
a.ElmahConnectionString = ConfigurationManager.ConnectionStrings["elmah-sqlserver"].ConnectionString;
Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception("Elmah availability test"));
a.ElmahSuccess = true;
} catch (Exception ex) {
a.ElmahSuccess = false;
a.ElmahException = ex;
Response.StatusCode = 503;
}
return View(a);
当 ELMAH 成功时,一切都很好。当它抛出任何类型的错误(数据库权限等)时,我会收到一个错误,该错误未被 try/catch 或任何正常的错误捕获部分捕获:ASP.NET MVC HandleError
、customErrors
重定向,甚至httpErrors
在system.webServer
. 显示不是正常的 IIS 通用消息,而是我看到一行显示“服务不可用”。
回复:
LTSB-W34511 C:\s\d\build % curl -i http://server/test/availability
HTTP/1.1 503 Service Unavailable
Cache-Control: public, max-age=14400, s-maxage=0
Content-Type: text/html
Server: Microsoft-IIS/7.5 X-AspNetMvc-Version: 4.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 06 Aug 2014 15:46:55 GMT
Content-Length: 27
The service is unavailable.
就是这样。至少我知道我的可用性不起作用,但我想至少向用户显示它是导致问题的 ELMAH,并显示它试图使用的连接字符串。所以,我需要以某种方式捕获这个异常。
我已经尝试以多种不同的方式调整我的 web.config,但我怀疑 ELMAH 将自身插入模块管道的方式存在一些问题,这阻止了我处理这个问题。
编辑:
为了澄清,这是一个简化的例子。我不打算向最终用户公开这些信息。此可用性页面仅对解决未来问题的内部用户可用。
ELMAH 只是相关应用程序使用的服务/数据库之一,我想为管理员提供一个快速的仪表板式视图,了解上下运行的情况。如果 ELMAH 错误导致这个 insta-503,我不能这样做。