O IIS está substituindo meu conteúdo de resposta, se eu definir manualmente o Response.StatusCode

20

Problema

quando defino manualmente o HTTP Statusfluxo de resposta como, digamos, 404ou 503, o IIS renderiza o conteúdo / exibição do IIS em estoque, em vez da minha exibição personalizada.

Quando faço isso com o servidor de desenvolvimento da web (AKA. Cassini ), ele funciona corretamente (ou seja, meu conteúdo é exibido e os response.statuscode== meus dados inseridos).

Existe alguma maneira de substituir esse comportamento?

Como replicar

Crie um aplicativo Web ASP.NET MVC1 padrão. Adicione a seguinte rota

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

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

}

Agora substitua o método Index do HomeController por ...

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

Respostas:

18

Ok - encontrou a resposta. Como eu esperava, o IIS está seqüestrando minhas não 200 respostas. Não tenho certeza (ou seja, não tenho certeza se esse é o comportamento padrão OU se deve a uma configuração que um dos membros da equipe atualizou na configuração da máquina, etc ...).

De qualquer forma, a chave aqui é dizer ao IIS para não manipular nenhum recurso de resultado que não seja de 200.

Quão? Configure a entrada no web.config.

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

Agora, a chave aqui é existingResponse="PassThrough". Aquele garoto mau diz ao IIS para deixar meus recursos em paz se o código de status HTTP! = 200.

Quer mais informações? Claro: Leia mais sobre este elemento no site oficial do IIS .

Pure.Krome
fonte
httpErrors é como Páginas de erro -> 500 -> Editar configurações de recursos -> "Erros detalhados" ? _http: //stackoverflow.com/questions/2640526/detailed-500-error-message-asp-iis-7-5_
Kiquenet
aaaahhh .. O bom e velho IIS está dificultando as coisas :)
AR
4

Outra maneira de contornar isso é executar o seguinte código no aplicativo ASP:

Response.TrySkipIisCustomErrors = true;

Fonte: /programming//a/21271085/238753

Sam
fonte
-2

Tenha cuidado com essa abordagem em geral. Você NÃO deve exibir o status 404.

  • Acho que quando um código de status de erro é retornado, o IIS retorna a página de erro de status registrada com ele - não a saída do processamento. Então, você pode colocar uma página HTML lá (ou um link para uma página aspx). http://professionalaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspx tem uma boa explicação sobre como configurar uma página de erro.

  • Mas isso é irrelevante. Muitos navegadores, por padrão, NÃO mostram essa saída, mas algo definido no navegador. Portanto, se você confiar nas pessoas que visualizam sua página 404 - isso pode não acontecer. Eles podem ver a página 404 configurada no navegador para eles.

TomTom
fonte
1
Por que eu não deveria renderizar uma exibição em um 404? Eu quero uma página personalizada e minha página pode exigir alguma lógica (em vez de uma página de erro estática de html).
Pure.Krome
porque o modelo MVC não se integra ao modelo de página de erro do IIS. Que simples. Você precisa voltar ao modelo do IIS para isso. Registre um URL da página para o caso 404. Coloque uma página dinâmica lá - não tenho certeza se isso realmente pode apontar para um URL MVC, mas deve se originar no registro da página 404.
TomTom
Incorreta. A maioria dos navegadores renderiza o conteúdo de uma página retornada com um status HTTP 404. Nem todos, mas a maioria. Além disso, por padrão, o IIS respeitará o código de status definido por qualquer código em um site .NET, desde que nenhum outro módulo o substitua posteriormente no pipeline. Veja a resposta do autor da pergunta sobre como isso estava acontecendo neste caso.
Mufasa