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

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

Проблема

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

Когда я делаю это с сервером веб-разработки (AKA. Кассини), он работает правильно (то есть мой контент отображается и 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();
    }
}

Хорошо - нашел ответ. Как я и ожидал, 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.

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

Response.TrySkipIisCustomErrors = true;

Источник: https://stackoverflow.com/a/21271085/238753

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

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

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