带有文件扩展名的网址的MVC Catch 404错误,而不使用RAMMFAR

时间:2015-06-24 16:55:04

标签: asp.net asp.net-mvc asp.net-mvc-4

我已经对HttpHandlers和HttpModules进行了一些研究,我不清楚按照我的规范实现这个的最佳方法。

我的问题是StaticFile处理程序处理所有带扩展名的网址,并返回默认的IIS 404页面,而不是访问NotFound的{​​{1}}操作。我想使用MVC来处理所有404,因为在.html页面上使用.cshtml页面的好处以及我执行日志记录和所有404响应以及页面包含一些动态内容的事实。

我不想启用ErrorsController,因为它会导致性能影响,因为这似乎是错误的方法。

创建一个HttpModule是否合理并检查是否存在所请求的文件,如果没有找到,则将请求发送到托管管道并最终发送到我的<modules runAllManagedModulesForAllRequests="true">来处理请求?

1 个答案:

答案 0 :(得分:0)

我的解决方案处理来自未经身份验证的用户的所有 404,这包括所有带有文件扩展名的 url。此解决方案的好处是 existingResponse='Auto' 确定 ErrorController 是否已处理 404,如果是,它将跳过此步骤,但如果没有,请使用提供的自定义错误页面。

您必须使用 Response.TrySkipIisCustomErrors = true; 跳过 IIS 自定义错误。

您可能需要在方法中使用 Response.StatusCode = (int)HttpStatusCode.NotFound;

再次设置状态代码

在您的ErrorController

 [HttpGet]
        public ActionResult 404()
        {
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            Response.TrySkipIisCustomErrors = true;
            return View("Index", new ErrorModel
            {
//Fill in properties values you have in your ErrorModel.
         
            });
        }

在您的 webconfig 中。

  <httpErrors errorMode="Custom" existingResponse="Auto">
      <remove statusCode="404" />
      <error statusCode="404" path="/Error/404" responseMode="ExecuteURL" />
    </httpErrors>