MVC игнорирует CustomErrors и перенаправляет на 404 ошибки - PullRequest
1 голос
/ 14 марта 2012

У меня есть два веб-сайта, 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?

Ответы [ 2 ]

0 голосов
/ 14 марта 2012

Решено: Заголовок ответа устанавливался с кодом 404, а затем закрывался. Я изменил фабрику контроллеров так, чтобы она не вызывала .End(), и теперь все ведет себя как ожидалось.

0 голосов
/ 14 марта 2012

Попробуйте добавить косую черту. В противном случае он может пытаться перейти к 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>
...