IIS переосмислює вміст відповідей, якщо я вручну встановив Response.StatusCode


20

Проблема

коли я вручну встановлюю HTTP Statusсвій потік відповідей на, скажімо, 404або 503, IIS надає вміст / перегляд запасів 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();
    }
}

Відповіді:


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 .


httpErrors - це як Сторінки помилок -> 500 -> Редагувати параметри функції -> "Детальні помилки" ? _http: //stackoverflow.com/questions/2640526/detailed-500-error-message-asp-iis-7-5_
— Kiquenet

aaaahhh .. Добрий ol 'IIS ускладнює легкі речі :)
— AR


-2

Будьте обережні з таким підходом загалом. НЕ ВИМОЖАЙТЕ відображати перегляд статусу 404.

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

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


1
Чому я не повинен відображати вид на 404? Я хочу користувацьку сторінку, і моїй сторінці може знадобитися певна логіка (замість статичної сторінки помилки html).
— Pure.Krome

тому що модель MVC не інтегрується з моделлю сторінки помилок IIS. Це просто. Ви повинні повернутися до моделі IIS для цього. Зареєструйте URL-адресу сторінки для випадку 404. Помістіть туди якусь динамічну сторінку - я не впевнений, чи справді це МОЖЛИВО вказувати на URL-адресу MVC, але MUSt бере початок при реєстрації сторінки 404.
— TomTom

Неправильно. Більшість браузерів відображатиме вміст сторінки, повернутої зі статусом HTTP 404. Не всі, але більшість. Крім того, IIS за замовчуванням буде дотримуватися коду статусу, встановленого будь-яким кодом на сайті .NET, до тих пір, поки жодні інші модулі не перекриють цей пізніше на конвеєрі. Дивіться відповідь автора запитання про те, як це відбувалося в даному випадку.
— Муфаса
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.