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

17

Problema

quando eu defino manualmente o HTTP Status do meu fluxo de resposta para, digamos, 404 ou 503 , o IIS renderiza o conteúdo / exibição do IIS em estoque, em vez da visualização personalizada.

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

Existe alguma maneira de superar esse comportamento?

Como replicar

Crie um aplicativo da Web ASP.NET MVC1 padrão. Adicione o seguinte caminho

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 do Índice do HomeController por ...

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

3 respostas

17

Ok - encontrei a resposta. Como eu esperava, o IIS está sequestrando minhas não 200 respostas. Não tenho certeza (ou seja, não tenho certeza se esse é o comportamento padrão OU é por causa de uma configuração de um dos membros da equipe atualizada na configuração da máquina, etc ...).

De qualquer forma, a chave aqui é dizer ao IIS para não manipular quaisquer recursos de resultado de status não-200.

Como? Entrada de configuração no web.config.

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

Agora, a chave aqui é existingResponse="PassThrough" . Esse bad boy diz ao IIS para deixar meus recursos sozinhos se o código de status HTTP = 200.

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

    
por 19.03.2010 / 00:58
1

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

Response.TrySkipIisCustomErrors = true;

Fonte: link

    
por 14.12.2016 / 02:56
-2

Tenha cuidado com essa abordagem em geral. Você NÃO deve renderizar uma visão sobre 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). link tem uma boa explicação de como configurar uma página de erro.

  • Mas isso é irrelevante. Um grande número de navegadores, por padrão, NÃO mostra essa saída, mas algo definido no navegador. Então, se você confiar em pessoas vendo sua página 404 - isso pode não acontecer. Eles podem ver a página 404 que está configurada no navegador para eles.

por 18.03.2010 / 08:29