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();
    }
}
Pure.Krome
źródło

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 .

Pure.Krome
źródło
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
4

Innym sposobem obejścia tego jest uruchomienie następującego kodu w aplikacji ASP:

Response.TrySkipIisCustomErrors = true;

Źródło: /programming//a/21271085/238753

Sam
źródło
-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.

TomTom
źródło
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,