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.