MVC忽略CustomErrors并重定向404错误

时间:2012-03-13 22:37:10

标签: asp.net-mvc model-view-controller url-routing asp.net-mvc-routing http-status-code-404

我有两个网站AB,配置非常相似,都在ASP.NET MVC 3上运行。 两者都有ErrorController以及CustomErrors的以下web.config设置:

<customErrors mode="On" defaultRedirect="Error" />

对于这两个网站,所有服务器例外都会按预期重定向到ErrorController.Index()。对于网站A404错误的行为与任何其他服务器异常相同,并且会重定向到ErrorController.Index()。对于网站B404错误从未点击ErrorController,网站会在从StatusCode返回时立即向浏览器返回404 Application_Error。< / p>

为了缩小问题的原因,我从<customErrors />设置切换到此实现:

How to implement proper HTTP error handling in .NET MVC 2?

此解决方案适用于网站A,但仍会在网站StatusCode上返回404 B,即使使用此解决方案 点击B的{​​{1}}并成功返回(然后立即返回ErrorController.Index()代码。)

是否有人知道我可能遗漏的某些设置,与其他例外情况相比,404错误的处理方式有所不同?它似乎介于404的返回和发送到浏览器的响应之间.MVC再次使用Application_Error代码覆盖响应。

当我在404的右括号上点击Step-Into时,这是调试输出,响应包含自定义错误回复。由于这是所有.NET代码,我倾向于认为问题在于配置......

Application_Error

这是Step into: Stepping over non-user code 'System.Web.HttpApplication.ApplicationStepManager.ResumeSteps' Step into: Stepping over non-user code 'System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest' Step into: Stepping over non-user code 'System.Web.HttpRuntime.ProcessRequestInternal' Step into: Stepping over non-user code 'Microsoft.VisualStudio.WebHost.Request.Process' Step into: Stepping over non-user code 'Microsoft.VisualStudio.WebHost.Host.ProcessRequest' Step into: Stepping over non-user code 'System.Runtime.Serialization.ObjectCloneHelper.GetObjectData' Step into: Stepping over non-user code 'System.Runtime.Serialization.ObjectCloneHelper.GetObjectData' Step into: Stepping over non-user code 'System.Runtime.Serialization.ObjectCloneHelper.PrepareConstructorArgs' Step into: Stepping over non-user code 'System.Runtime.Remoting.Messaging.LogicalCallContext.LogicalCallContext' Step into: Stepping over non-user code 'System.Runtime.Serialization.ObjectCloneHelper.PrepareConstructorArgs' Step into: Stepping over non-user code 'System.Threading.ExecutionContext.ExecutionContext' Step into: Stepping over non-user code 'System.Threading.ThreadPoolWorkQueue.Dispatch'

引发的例外情况
http://localhost/asdf

编辑: Fiddler日志(根据要求)

System.InvalidOperationException: The IControllerFactory did not return a controller for the name 'asdf'.

编辑:看起来响应标头已经在调用GET /asdf HTTP/1.1 Host: localhost:60000 Connection: keep-alive Cache-Control: max-age=0 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.54 Safari/535.19 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 Cookie: ASP.NET_SessionId=eedy1t51bn1ezpqpcyu50gyk; __RequestVerificationToken_Lw__=eaKTV3bjxX1o2WirmR5C3bBEZcRvzLoXu/+Q4IjC7CJ93cth4Wh7hKP3Uj9/l54hWL8P2MIf1THR+sg0ZEQzOPK3uH99MdyVk+l9/aMBcleP/J8ZZOVAJqKX6TyCUt/jaCUVCexhzq0hbIcTE2Kj23ReINU=; .ASPXAUTH=0F432A1EA5723F00959C20465475F680E3E623729BB205533F91C83E9A23E96F845CDE8FEDCE9C35F87024FE299B473601D05ACAFBB4F69B31566FD538FC0CCC54E6A824A1B0DD99AAB3292D5077A8D1830DE6992C6AF2E62ED382CE9448AE0D5A25FEEB50BB95D026767B53C72DA879CF77503F22DC8EE1A7B4EAE774E052EBF005F006; AccountID=1 HTTP/1.1 404 Not Found Server: ASP.NET Development Server/10.0.0.0 Date: Tue, 13 Mar 2012 23:08:08 GMT X-AspNet-Version: 4.0.30319 X-AspNetMvc-Version: 3.0 Cache-Control: private Content-Type: text/html Connection: Close 时发送,因此无论该方法发生了什么,或Application_Error浏览器都会只需显示web.config即可。有关哪些内容会引发网站404而不是B提前发送标题的建议?

2 个答案:

答案 0 :(得分:0)

尝试添加正斜杠。否则,它可能会尝试导航到http://localhost/asdf/Error

<customErrors mode="On" defaultRedirect="/Error" />

其他提示,请查看您的IIS日志。

使用fiddler查看所请求的内容。

我在WebConfig中使用以下内容。

    <customErrors mode="RemoteOnly">
        <error statusCode="404" redirect="/Error/Error404" />
        <error statusCode="500" redirect="/Error/Error500" />
    </customErrors>

答案 1 :(得分:0)

已解决:使用代码404设置响应标头,然后关闭。我将控制器工厂修改为不调用.End(),现在一切都按预期运行。