当无法匹配Controller路径时,.NET MVC会抛出500 Server错误而不是404 Not Found

sim*_*olo 9 asp.net asp.net-mvc exception-handling

出于某种原因,当将dud URL输入到不存在的文件/目录/控制器时,会引发以下错误:

System.Web.HttpException未找到路径''的控制器或未实现IController System.Web.Mvc.IController> GetControllerInstance(System.Web.Routing.RequestContext,System.Type)

IIS然后遵循常规错误处理并显示适用于500内部服务器错误的页面.应遵循404 Not Found错误处理逻辑. 我正在测试的另一个Web应用程序在找不到路由时不会抛出此HttpException,并正常返回404.那么触发这个HttpException是什么?

为什么以及如何遵循404路由来处理此类错误而不是500? 以下是错误处理的配置.没有其他代码处理错误.那么为什么总会显示500错误呢?就好像默认处理将"无法找到控制器"异常作为错误处理,而实际上它是未找到的.

<system.webServer>
 <httpErrors errorMode="Custom" existingResponse="Replace" defaultPath="/StaticErrors/Default.html" defaultResponseMode="ExecuteURL">
   <clear />
   <error statusCode="404" path="/mvcError/Http404" responseMode="ExecuteURL" />    
   <error statusCode="500" path="/mvcError/Http500" responseMode="ExecuteURL" />     
 </httpErrors>
</system.webServer>
<system.web>
 <customErrors defaultRedirect="/StaticErrors/Default.html" mode="On" redirectMode="ResponseRewrite">
   <error redirect="/mvcError/Http404" statusCode="404" />          
   <error redirect="/mvcError/Http500" statusCode="500" />         
 </customErrors>
</system.web>
Run Code Online (Sandbox Code Playgroud)

失败的请求跟踪显示了这一点.基本上没有路由是圆的,抛出HttpException,500路由处理开始,而不是404.我没有做任何事情来覆盖任何正常的默认行为.在HandleErrorAttribute不添加任何的MVC过滤器.

在此输入图像描述

Hiệ*_* Lê 1

您应该添加一个过滤器控制器来覆盖某些 IIS 自定义错误。

public class mvcErrorController : Controller
   {
    public ActionResult Http404()
    {
    Response.StatusCode = 404;
    Response.TrySkipIisCustomErrors = true; 
    return View();
   }
}
Run Code Online (Sandbox Code Playgroud)