【问题标题】:Application_Error is not catching 404 type of errorApplication_Error 未捕获 404 类型的错误
【发布时间】:2017-03-12 12:24:24
【问题描述】:

我想全局捕获这些类型的错误,以便将它们记录到数据库并向用户显示一条好消息:500、403 和 404。我正在使用 Log4Net 处理错误。

void Application_Error(object sender, EventArgs e)
{      
  string redirectUrl = "~/Error/GenericError.aspx"; //I put a breakpoint here...
  var httpException = (HttpException)Server.GetLastError();
  int httpCode = httpException.GetHttpCode();

  //more code here...
}

只有在异常发生时才触发断点,然后将错误识别为500。

但是,当我拼错一个 URL 时,除了 404 错误之外,Application_Error 方法会捕获该错误。相反,我的浏览器显示了这个页面(见截图)。在这种情况下无法记录错误。

我是 ASP.NET Webform 4.5。在之前的版本中,例如 ASP.NET 4.0,我能够捕获所有 3 种类型的错误。

有没有办法也捕获 404 错误?

【问题讨论】:

  • 您的 web.config@sytem.web\customErrors 部分中有任何配置吗?
  • System.web 部分中没有CustomError 或与error 相关的任何内容。

标签: c# asp.net webforms


【解决方案1】:

“拼错 url”我假设您的意思是 url 的控制器/操作部分(与域或子域相比),否则这将是一个没有实际意义的问题。如果是这样,那么就像 K.Tamayo 提到的那样检查 customerrors 是否关闭,如下所示:

<configuration> <system.web> <customErrors mode="Off"/> </system.web> </configuration>

【讨论】:

  • 整个配置文件中没有与customErrors 相关的内容。我一直到文件末尾的一个部分是我为log4net 定义的。我的意思是拼写错误:我写的不是customers/Dashboard,而是customers/Dashboard__XX。另外,它不是MVC,而是webform 4.5
  • Asp.Net Pipeline 应该对所有人都一样,就像 web.config 一样。继续在 web.config 的 system.web 部分添加前面提到的 customerrors 标签。完成此操作后,我建议您在 VS 调试模式下运行,并在 Application_Error 方法中设置断点。
  • 此外,您可以通过将其他标准管道事件方法添加到 Global.asax 中来获取有关 http 请求的详细信息。例如,您可以添加“protected void Application_BeginRequest(object sender, EventArgs e) {//您的命令在这里;任何可以设置断点的操作都可以}。这是管道的一个好的参考链接:stackoverflow.com/questions/441421/…
  • 我已经添加了 customErrors 部分并在 Application_Error 方法中放置了一个断点,但没有成功。
  • 我添加了 Application_BeginRequest 并设置了一个断点。断点被击中,这是一个不错的新功能。那我怎么知道请求失败了,错误是404呢?
【解决方案2】:

您可以从 web.config 中配置 404 页面,如下所示

<configuration>
  <system.web>
    <customErrors mode="On" >
      <error statusCode="404" redirect="404.aspx?/>
    </customErrors>
  </system.web>
</configuration

在 404.aspx 中,您可以记录错误并显示您想要的任何内容。

我不确定为什么 Application_Error 没有被触发,但我相信它应该在发生服务器端异常时工作,但根据这个问题的答案,它应该工作

Best way to implement a 404 in ASP.NET

【讨论】:

  • 我已经将上面的代码添加到了配置文件中,但是我仍然没有被重定向到 404 页面。
【解决方案3】:

框架本身管理的一些请求。所以它不会命中 Application_Error

如果您想捕获 Application_Error 中的所有错误,请在 web.config

中添加以下内容
<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

在下面的帖子中找到详细的回复。

https://stackoverflow.com/a/11258217/7013033

【讨论】:

    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2014-12-07
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多