IIS переопределяет содержимое моего ответа, если я вручную установил Response.StatusCode

20

проблема

когда я вручную устанавливаю HTTP Statusдля своего потока ответов, скажем, 404или 503IIS, вместо моего пользовательского представления отображается стандартный контент / представление IIS.

Когда я делаю это с сервером веб-разработки (AKA. Cassini ), он работает правильно (то есть отображается мой контент и response.statuscode== мои введенные данные).

Есть ли способ, которым я могу отменить это поведение?

Как тиражировать

Создайте веб-приложение ASP.NET MVC1 по умолчанию. Добавьте следующий маршрут

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",
        "{*catchall}",
        new { controller = "Home", action = "Index" }
        );

}

Теперь замените метод индекса HomeController на ...

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        Response.StatusCode = 404;
        return View();
    }
}
Pure.Krome
источник

Ответы:

18

Ок - нашел ответ. Как я и ожидал, IIS угоняет мои не 200 ответов. Не уверен (т. Е. Я не уверен, является ли это поведением по умолчанию ИЛИ это из-за настройки, которую один из членов команды обновил в конфигурации машины, и т. Д ...).

В любом случае, ключ здесь заключается в том, чтобы IIS не обрабатывал какие-либо не-200 результирующие ресурсы статуса.

Как? Запись конфигурации в web.config.

<system.webServer>
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough"/>
    .... snipped other IIS relevant elements ... 
</system.webServer>

Теперь ключ здесь existingResponse="PassThrough". Этот плохой парень говорит IIS оставить мои ресурсы в покое, если код состояния HTTP = 200.

Хотите узнать больше? Конечно: Узнайте больше об этом элементе на официальном сайте IIS .

Pure.Krome
источник
httpErrors похож на страницы ошибок -> 500 -> Изменить параметры функции -> «Подробные ошибки» ? _http: //stackoverflow.com/questions/2640526/detailed-500-error-message-asp-iis-7-5_
Kiquenet
а-а-а-а-а-а-а-а-а-а!: Хорошо, что IIS усложняет задачу :)
AR
4

Другой способ обойти это - запустить следующий код в приложении ASP:

Response.TrySkipIisCustomErrors = true;

Источник: /programming//a/21271085/238753

Сэм
источник
-2

Будьте осторожны с таким подходом в целом. Вы не должны отображать статус 404.

  • Я думаю, что когда возвращается код состояния ошибки, IIS возвращает страницу ошибки состояния, которая зарегистрирована в нем, а не результаты обработки. Таким образом, вы можете поместить туда HTML-страницу (или ссылку на страницу aspx). http://professionalaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspx имеет хорошее объяснение того, как настроить страницу с ошибкой.

  • Но это не имеет значения. Многие браузеры по умолчанию НЕ показывают этот вывод, но что-то установлено в браузере. Так что, если вы полагаетесь на людей, просматривающих вашу страницу 404 - этого может не произойти. Они могут увидеть страницу 404, настроенную для них в браузере.

TomTom
источник
1
Почему я не должен отображать вид на 404? я хочу пользовательскую страницу, и моя страница может потребовать некоторой логики (вместо статической страницы ошибки HTML).
Pure.Krome
Потому что модель MVC не интегрируется с моделью страницы ошибок IIS. Так просто. Вы должны вернуться к модели IIS для этого. Зарегистрируйте URL страницы для случая 404. Поместите туда некоторую динамическую страницу - я не уверен, МОЖЕТ ли это на самом деле МОЖЕТ указывать на URL MVC, но он ДОЛЖЕН возникать при регистрации 404 страницы.
TomTom
Неправильно. Большинство браузеров отображают содержимое страницы, возвращенной со статусом HTTP 404. Не все, но большинство. Кроме того, IIS по умолчанию будет учитывать код состояния, установленный любым кодом на сайте .NET, если другие модули не переопределяют его позже в конвейере. Смотрите ответ автора вопроса о том, как это происходило в этом случае.
Муфаса