如果URL不包含现有控制器,则从未达到404的Application_Error

时间:2016-09-27 00:23:59

标签: c# asp.net-mvc error-handling asp.net-mvc-5

我在global.asax中有这段代码:

protected void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    var httpException = exception as HttpException;
    //...
}

如果我调用这样的网址,NonExistingNonesense不存在:

localhost/ExistingArea/ExistingController/NonExistingNonesense

一切都很好。 (将调用我的global.asax中的代码)

但如果我这样称呼网址:

localhost/NonExistingNonesense

代码永远不会达到Application_Error方法。

可能是什么问题?

我在web.config中有这个:

<system.web>
  <customErrors mode="On"></customErrors>
  <!-- ... -->
</system.web>
<system.webServer>
  <httpErrors existingResponse="PassThrough"/>
  <!-- ... -->
<system.webServer>

请注意:

我知道这可以用

<error statusCode="404" responseMode="ExecuteURL" path="/Error/PageNotFound" />

问题是,我需要将一些异常上下文传递给我的视图,所以我想通过代码处理它。

2 个答案:

答案 0 :(得分:0)

除非IIS框架调用ASP.NET代码,否则不会触发它。默认情况下,IIS将在文件到达您的代码之前停止对不存在的文件的任何请求。但你可以关闭它。

进入IIS管理员并禁用Invoke handler only if request is mapped to a file选项。

答案 1 :(得分:0)

我不知道为什么代码在没有调试代码的情况下无法访问Application_Error。

但是,您可能希望尝试从Exception过滤404状态代码,并重定向到自定义404页面。

protected void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();

    // Process 404 HTTP errors
    var httpException = exception as HttpException;
    if (httpException != null && httpException.GetHttpCode() == 404)
    {
        Response.Clear();
        Server.ClearError();
        Response.TrySkipIisCustomErrors = true;

        // Call target Controller and pass the routeData.
        IController controller = new CommonController();

        var routeData = new RouteData();
        routeData.Values.Add("controller", "Common");
        routeData.Values.Add("action", "PageNotFound");

        var requestContext = new RequestContext(
             new HttpContextWrapper(Context), routeData);
        controller.Execute(requestContext);
    }
}

CommonController

public class CommonController : Controller
{
    [AllowAnonymous]
    public ActionResult PageNotFound()
    {
        Response.StatusCode = 404;
        Response.TrySkipIisCustomErrors = true;

        return View();
    }
}

如果您只想检索异常上下文,可以使用错误操作方法检索它。

  <system.web>
    <customErrors defaultRedirect="~/Common/Error" mode="On">
      <error statusCode="404" redirect="~/Common/PageNotFound"/>
    </customErrors>
  </system.web>


public class CommonController : Controller
{
    [AllowAnonymous]
    public ActionResult Error()
    {
        var exception = Server.GetLastError(); <--- Get Exception

        Response.StatusCode = 503;
        Response.TrySkipIisCustomErrors = true;

        return View();
    }   
}