Usługi IIS zastępują treść mojej odpowiedzi, jeśli ręcznie ustawię kod Response.StatusCode


20

Problem

kiedy ręcznie ustawiam HTTP Statusstrumień odpowiedzi na, powiedzmy, 404lub 503IIS renderuje zawartość / widok zapasowy IIS zamiast mojego widoku niestandardowego.

Kiedy robię to za pomocą webowego serwera programistycznego (AKA. Cassini ), działa on poprawnie (to znaczy, moja treść jest wyświetlana, a response.statuscode== moje wprowadzone dane).

Czy jest jakiś sposób, aby zmienić to zachowanie?

Jak się replikować

Utwórz domyślną aplikację internetową ASP.NET MVC1. Dodaj następującą trasę

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

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

}

Teraz zamień metodę indeksu HomeController na ...

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        Response.StatusCode = 404;
        return View();
    }
}

Odpowiedzi:


18

Ok - znalazłem odpowiedź. Tak jak się spodziewałem, IIS przechwytuje moje nie 200 odpowiedzi. Nie jestem pewien (tzn. Nie jestem pewien, czy jest to zachowanie domyślne LUB z powodu ustawienia jednego z członków zespołu zaktualizowanego w konfiguracji komputera itp.).

W każdym razie kluczem tutaj jest poinformowanie IIS, aby nie obsługiwał żadnych zasobów wyników innych niż 200.

W jaki sposób? Skonfiguruj wpis w pliku web.config.

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

Kluczem jest tutaj existingResponse="PassThrough". Ten zły chłopiec każe IIS zostawić moje zasoby w spokoju, jeśli kod statusu HTTP! = 200.

Chcesz więcej informacji? Pewnie: Przeczytaj więcej o tym elemencie na oficjalnej stronie IIS .


httpErrors przypomina Strony błędów -> 500 -> Edytuj ustawienia funkcji -> „Błędy szczegółowe” ? _http: //stackoverflow.com/questions/2640526/detailed-500-error-message-asp-iis-7-5_
— Kiquenet

aaaahhh .. Dobry stary IIS ułatwiający łatwe rzeczy :)
— AR


-2

Bądź ostrożny z tym podejściem w ogóle. NIE powinieneś renderować widoku statusu 404.

  • Myślę, że gdy zwracany jest kod statusu błędu, IIS zwraca zarejestrowaną z nim stronę błędu statusu - a nie dane wyjściowe z przetwarzania. Możesz więc umieścić tam stronę HTML (lub link do strony aspx). http://professionalaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspx ma ładne wyjaśnienie, jak skonfigurować stronę błędu.

  • Ale to nie ma znaczenia. Sporo przeglądarek domyślnie NIE pokazuje tego wyniku, ale coś ustawionego w przeglądarce. Jeśli więc polegasz na tym, że ludzie widzą twoją stronę 404 - może się tak nie stać. Mogą zobaczyć dla nich stronę 404 skonfigurowaną w przeglądarce.


1
Dlaczego nie powinienem renderować widoku na 404? Chcę niestandardową stronę, a moja strona może wymagać pewnej logiki (zamiast statycznej strony błędu HTML).
— Pure.Krome

ponieważ model MVC nie integruje się z modelem strony błędu IIS. Tak prosty. W tym celu musisz wrócić do modelu IIS. Zarejestruj adres URL strony dla przypadku 404. Umieść tam stronę dynamiczną - nie jestem pewien, czy to MOGŁO wskazywać adres URL MVC, ale MUSt pochodzi z rejestracji strony 404.
— TomTom,

Błędny. Większość przeglądarek wyświetli treść strony zwróconej ze statusem 404 HTTP. Nie wszystkie, ale większość. Ponadto usługi IIS domyślnie będą przestrzegać kodu statusu ustawionego przez dowolny kod w witrynie .NET, o ile inne moduły nie będą nadpisywać tego w późniejszym etapie. Zobacz odpowiedź autora na pytanie, jak to się działo w tym przypadku.
— Mufasa,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.