【问题标题】:MVC Catch 404 errors for urls with file extensions without using RAMMFAR不使用 RAMMFAR 的带有文件扩展名的 url 的 MVC 捕获 404 错误
【发布时间】:2015-06-24 16:55:04
【问题描述】:

我对 HttpHandlers 和 HttpModules 进行了一些研究,但我不清楚按照我的规范实现它的最佳方式。

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

我不想启用<modules runAllManagedModulesForAllRequests="true">,因为它会影响性能,而且这样做似乎是错误的方式。

创建一个 HttpModule 并让它检查请求的文件是否存在,如果找不到,将请求发送到托管管道并最终发送到我的ErrorsController 处理请求是否可行?

【问题讨论】:

  • 未确认,但 global_asax Application_Error 不会发现所有错误吗?还是静态文件绕过这个?
  • 不,静态文件不会到达托管管道。我正在使用更强大的Application_EndRequest。有趣的是,某些文件扩展名之所以这样做,是因为它们是由StaticFile 以外的处理程序处理的。 .cshtml、.axd、.rem、.aspq、.vbhtml 等扩展名都通过托管管道运行,并带有我可以捕获的正确 404 消息。
  • IIS(自定义错误页面)允许您使用 302 重定向进行响应,您可以根据状态代码设置该重定向。因此,您的 404 错误可以通过 url 响应您的应用程序。不过我从来没有尝试过。
  • @Jasen 我认为我无法获取原始请求路径或任何要记录的请求参数。我还尝试记录 iis 将在拒绝请求时填充的子状态代码,例如,它包含双重转义字符。
  • 我不确定我是否完全理解,所以请原谅我,但您能否在 web.config 中使用httperrors(或customerrors,如果您有较旧的 IIS),请指出特定代码到Error 控制器中的方法,从Request 中提取任何您想要的日志并提供所需的状态代码和cshtml 视图?有关更多详细信息(如果相关),请参见此处:stackoverflow.com/questions/28989026/…

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


【解决方案1】:

我的解决方案在这里处理来自未经身份验证的用户的所有 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>

【讨论】:

    猜你喜欢
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2010-10-26
    • 2015-07-06
    • 2018-03-02
    • 2020-04-14
    • 2011-06-15
    相关资源
    最近更新 更多