IIS7 and HTTP status code handling
This question is posted on Stack Overflow, and I'm cross-posting here because I think this might be a more correct forum for it.
У меня сильная головная боль от попытки получить полный программный контроль над отображением ошибки в 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?
1 ответ
Это можно сделать, установив раздел в%windir%\system32\inetsrv\applicationHost.config, чтобы не найденная страница обрабатывалась вашей базовой фабрикой обработчиков страниц. Если вы просматриваете обработчик для.aspx, просто скопируйте его и установите его для обработчика файла с подстановочными знаками.
Я верю, что это будет примерно так:
<add name="Catch-all" path="*" verb="GET,HEAD,POST,DEBUG" type="System.Web.UI.PageHandlerFactory" />
Имейте это перезаписывают правило StaticFile внизу.