我有两个网站A
和B
,配置非常相似,都在ASP.NET MVC 3上运行。
两者都有ErrorController
以及CustomErrors的以下web.config设置:
<customErrors mode="On" defaultRedirect="Error" />
对于这两个网站,所有服务器例外都会按预期重定向到ErrorController.Index()
。对于网站A
,404
错误的行为与任何其他服务器异常相同,并且会重定向到ErrorController.Index()
。对于网站B
,404
错误从未点击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
提前发送标题的建议?
答案 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()
,现在一切都按预期运行。