Как остановить IIS7 от выпуска собственного 404, прежде чем мое приложение MVC получит возможность справиться с этим?

У меня есть приложение ASP.NET MVC 2, у которого есть обработчик события Application_Error в global.asax. В этом случае я обнаруживаю случай, когда тип исключения является HttpException, а HTTP-код - 404 и перенаправляется на мою собственную страницу обработки 404.

Это отлично работает на моем сервере разработки Cassini, но теперь я пытаюсь переместить его на мой производственный сервер с IIS7 (с использованием встроенного режима).

Когда я запрашиваю несуществующий URL-адрес, IIS7 показывает свою собственную страницу 404, и, насколько я могу судить, мой метод Application_Error никогда не вызывается.

Как это исправить?

Ответы

Ответ 1

Я ответил, что в другом посте: Приложение ASP.NET, размещенное на IIS7, которое игнорирует пользовательские ошибки и возвращается к ошибкам IIS

"Чтобы отключить сообщения об ошибках IIS, вы должны установить

  Response.TrySkipIisCustomErrors = true;

на странице с ошибкой. После этого ваши сообщения об ошибках должны отображаться без проблем. "

Ответ 2

Нельзя ли отключить 404 httpError:

    <httpErrors errorMode="Custom">
        <remove statusCode="404" subStatusCode="-1" />
    </httpErrors>

Ответ 3

В ASP.NET MVC я использую собственный ErrorController с методом Index (обработчик по умолчанию) и несколько пользовательских обработчиков (401, 404), используя следующие настройки web.config

<!--  CUSTOM ERROR MESSAGES
Set customErrors mode="On" or "RemoteOnly" to enable custom error messages, "Off" to disable. 
Add <error> tags for each of the errors you want to handle.   
"On" Always display custom (friendly) messages.
"Off" Always display detailed ASP.NET error information.
"RemoteOnly" Display custom (friendly) messages only to users not running 
on the local Web server. This setting is recommended for security purposes, so 
that you do not display application detail information to remote clients. -->
<customErrors mode="Off" defaultRedirect="~/Error">
    <error statusCode="401" redirect="~/Error/Unauthorized" />
    <error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>

Я не использую Application_Error, кроме ведения журналов.

Ответ 5

Ответ Flynn решил мою проблему ASP.NET, взяв под свой контроль 404

Теперь я могу это сделать:

Response.TrySkipIisCustomErrors = true;
Response.StatusCode = 404;
Response.Write("<script type='text/javascript'>setTimeout(function () { window.location = '/'; }, 1000)</script>");
HttpContext.Current.ApplicationInstance.CompleteRequest();