Asp.net MVC捕获404错误,用于不使用RAMMFAR的具有文件扩展名的URL

Asp.net MVC捕获404错误,用于不使用RAMMFAR的具有文件扩展名的URL,asp.net,asp.net-mvc,asp.net-mvc-4,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我对HttpHandlers和HttpModules做了一些研究,但我不清楚在我的规范中实现这一点的最佳方法 我的问题是,静态文件处理程序处理所有带有扩展名的URL,并将返回默认的IIS 404页面,而不是访问我的ErrorsController的NotFound操作。我想使用MVC来处理所有404,因为使用.cshtml页面优于.html页面的好处,以及我执行日志记录和所有404响应以及页面包含一些动态内容的事实 我不想启用,因为它会对性能造成影响,而且这样做似乎是错误的 创建一个HttpMo

我对HttpHandlers和HttpModules做了一些研究,但我不清楚在我的规范中实现这一点的最佳方法

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

我不想启用
,因为它会对性能造成影响,而且这样做似乎是错误的


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

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

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

您可能必须使用
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.
         
            });
        }
网络配置中

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



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