У меня есть два веб-сайта, A
и B
, очень похожих по конфигурации, и оба работают на ASP.NET MVC 3. Оба имеют ErrorController
и следующие параметры web.config для CustomErrors:
<customErrors mode="On" defaultRedirect="Error" />
Для обоих веб-сайтов все серверные исключения перенаправляются на ErrorController.Index()
, как и ожидалось.Для веб-сайта A
, 404
ошибки ведут себя как любое другое исключение сервера и перенаправляются на ErrorController.Index()
.Для веб-сайта B
, 404
ошибки никогда не попадают в ErrorController
, и сайт сразу же возвращает браузеру StatusCode
404
после возврата из Application_Error
.
В попытке сузитьпричина проблемы Я перешел с настройки <customErrors />
на эту реализацию:
Как реализовать правильную обработку ошибок HTTP в .NET MVC 2?
Это решениеотлично работает на веб-сайте A
, но по-прежнему возвращает StatusCode
404
на веб-сайте B
, хотя при использовании этого решения делает попадание B
в ErrorController.Index()
и успешно возвращается (затем немедленнов любом случае возвращает код 404
.
Кто-нибудь знает о некоторых настройках, которые я могу пропустить, которые обрабатывают ошибки 404
иначе, чем другие исключения?Кажется, что где-то между возвратом Application_Error
и ответом, отправляемым в браузер, MVC снова перезаписывает ответ кодом 404
.
Вот отладочный вывод, когда я нажимаю Step-Into
назакрывающая скобка Application_Error
, точка, в которой ответ содержит пользовательский ответ об ошибке.Поскольку это весь код .NET, я склонен думать, что проблема заключается в конфигурации ...
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
:
System.InvalidOperationException: The IControllerFactory did not return a controller for the name 'asdf'.
Редактировать: Журнал Fiddler (согласно запросу)
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
, а не A
?