Назад | Перейти на главную страницу

IIS7 и обработка кода состояния HTTP

Этот вопрос размещен на Переполнение стека, и я отправляю здесь кросс-посты, потому что думаю, что это более подходящий форум для этого.

У меня ужасная головная боль от попытки получить полный программный контроль над рендерингом ошибки в IIS7 (интегрированный режим). То, что я хочу сделать, это ошибка (страница не найдена, внутренняя ошибка сервера, не аутентификация и т. Д.), Передать весь запрос в пользовательский ASPX или HTML (я предпочитаю последний) с правильным кодом состояния HTTP.

Я хочу, чтобы IIS7 не наплевал на то, что я установил для кода состояния HTTP. Мне не нужна его обработка ошибок. Когда я установил Response.StatusCode = (int)HttpStatusCode.NotFoundя хочу, чтобы IIS не отображал собственную страницу с ошибкой, а, возможно, передавал запрос в другой файл.

Я получил эту статическую конфигурацию для работы:

<configuration>
  <system.webServer>
    <httpErrors>
      <clear />
      <error statusCode="404" path="/errors/404.html" responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>
</configuration>

Хотя это работает, это не дает мне программного контроля над тем, что делать с ответом, учитывая сценарий ошибки. Конфигурация - хороший запасной вариант, но я бы очень хотел иметь возможность установить Response.StatusCode и отобразить что-то совершенно отличное от настроенного 404.html при определенных обстоятельствах (например, ответ JSON, если мы получаем Accept: application/json), но IIS7 мне не позволяет. Ни единого шанса.

Так что, черт возьми, я должен делать? Я пытался установить HttpResponse.TrySkipIisCustomErrors Property, но это выглядит как серьезная хитрость и не работает постоянно. Действительно ли установка для этого свойства значения true является рекомендуемой передовой практикой для получения желаемого поведения?

На данный момент у меня осталось не что иное, как сильная ненависть к IIS7. Может ли кто-нибудь помочь мне исправить это, доказав, что я просто глуп и действительно могу полностью контролировать стек HTTP?

Для этого нужно установить раздел в% windir% \ system32 \ inetsrv \ applicationHost.config, чтобы не найденная страница обрабатывалась вашей базовой фабрикой обработчиков страниц. Если вы просматриваете обработчик для .aspx, просто скопируйте его и установите для обработчика файла с подстановочными знаками.

Полагаю, это будет примерно так:

<add name="Catch-all" path="*" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" />

Попросите это перезаписать правило StaticFile внизу.