Tendo um problema estranho aqui. Todo mundo sabe que se você usar a customErrors
seção web.config para fazer uma página de erro personalizada, você deve definir seu Response.StatusCode
para o que for apropriado. Por exemplo, se eu fizer uma página 404 personalizada e chamá-la de 404.aspx, poderia inserir <% Response.StatusCode = 404 %>
o conteúdo para que tenha um cabeçalho de status 404 verdadeiro.
Me segue até agora? Boa. Agora tente fazer isso no IIS7. Eu não consigo fazer funcionar, ponto final. Se Response.StatusCode
estiver definido na página de erro personalizada, o IIS7 parece substituir completamente a página de erro personalizada e mostra sua própria página de status (se houver uma configurada).
Alguém mais viu esse comportamento e talvez saiba como contorná-lo? Estava funcionando no IIS6, então não sei por que as coisas mudaram.
Nota: Este não é o mesmo que o problema no ASP.NET Custom 404 Retornando 200 OK em vez de 404 Not Found
Respostas:
Defina existingResponse como PassThrough na seção system.webServer / httpErrors:
O valor padrão da propriedade existingResponse é Auto:
Mais informações: O que esperar do módulo de erro personalizado IIS7
fonte
<httpErrors existingResponse="PassThrough" />
equivalenteResponse.TrySkipIisCustomErrors
ou se comportam de maneira diferente?Response.TrySkipIisCustomErrors
você obtém um melhor controle quando exibir os erros personalizados do IIS.A maneira mais fácil de tornar o comportamento consistente é limpar o erro e usar Response.TrySkipIisCustomErrors e defini-lo como verdadeiro. Isso substituirá o tratamento da página de erro global IIS de dentro da sua página ou o manipulador de erro global em Application_Error.
Normalmente, você deve fazer isso em seu manipulador Application_Error que trata todos os erros que seus manipuladores de erro do aplicativo não estão detectando.
Informações mais detalhadas podem ser encontradas nesta postagem do blog: http://www.west-wind.com/weblog/posts/745738.aspx
fonte
customError
configurado no Web.config para gatilho. ComResponse.TrySkipIisCustomErrors = true
eu obtenho o mesmo comportamento: A página de erro gerado pelo servidor feia é exibida. Com ele definido comofalse
nada acontece - uma janela do navegador em branco.Server:Microsoft-IIS/8.5 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:5.2 X-Powered-By:ASP.NET
customErrors mode="Off"
para que isso funcione. Se eu fizer isso, o httpErrors existingResponse = "Auto" (o padrão) funcionará corretamente para mim quando eu usar o código nesta resposta.Resolvido: Acontece que os "Erros detalhados" precisam estar ativados para que o IIS7 "passe" qualquer página de erro que você possa ter. Veja http://forums.iis.net/t/1146653.aspx
fonte
Não tenho certeza se isso é semelhante em natureza ou não, mas resolvi um problema que parece semelhante à primeira vista e foi assim que resolvi.
Em primeiro lugar, o valor padrão para existingResponse (Auto) foi a resposta correta no meu caso, já que tenho um 404, 400 e 500 customizado (eu poderia criar outros, mas esses três serão suficientes para o que estou fazendo). Aqui estão as seções relevantes que me ajudaram.
De web.config:
E
A partir daí, adicionei isso a Application_Error em global.asax:
Em cada uma das minhas páginas de erro personalizadas, tive que incluir o código de status de resposta correto. No meu caso, estou usando um 404 personalizado para enviar usuários a diferentes seções do meu site, então não quero um código de status 404 retornado, a menos que seja realmente uma página inativa.
De qualquer forma, foi assim que eu fiz. Espero que ajude alguém.
fonte
Este problema tem sido uma grande dor de cabeça. Nenhuma das sugestões mencionadas anteriormente sozinhas resolveu isso para mim, então estou incluindo minha solução. Para registro, nosso ambiente / plataforma usa:
Especificamente, eu estava tentando obter uma resposta HTTP 404 que redirecionaria o usuário para nossa página 404 personalizada (por meio das configurações Web.config).
Primeiro, meu código teve que lançar um
HttpException
. Retornar aNotFoundResult
do controlador não atingiu os resultados que eu queria.Então eu tive que configure tanto o
customErrors
ehttpError
nós no Web.config....
Note que eu deixei o
existingResponse
comoAuto
, o que é diferente do que o @sefl solução fornecida.As
customErrors
configurações pareciam ser necessárias para lidar com minhas jogadas explicitamenteHttpException
, enquanto ohttpErrors
nó manipulava URLs que estavam fora dos padrões de rota especificados em Globals.asax.cs.PS Com essas configurações, eu não preciso definir
Response.TrySkipIisCustomErrors
fonte
TrySkipIisCustomErrors
é apenas parte de um quebra-cabeça. Se você usa páginas de erro personalizadas, mas também deseja entregar algum conteúdo RESTful com base nos status 4xx, você tem um problema. Definir httpErrors.existingResponse do web.config como "Auto" não funciona, porque .net parece sempre entregar algum conteúdo de página ao IIS, portanto, usar "Auto" faz com que todas (ou pelo menos algumas) Páginas de erro personalizadas não sejam usadas. Usar "Substituir" também não funcionará, porque a resposta conterá seu código de status http, mas seu conteúdo estará vazio ou preenchido com uma página de erro personalizada. E o "PassThrough" na verdade desativa o CEP, então ele não pode ser usado.Portanto, se você quiser ignorar o CEP em alguns casos (por ignorar, quero dizer retornar o status 4xx com algum conteúdo), você precisará de uma etapa adicional: limpe o erro:
Então, se você quiser usar a resposta REST (ou seja, 400 - Bad Request) e enviar algum conteúdo com ela, você só precisará definir
TrySkipIisCustomErrors
algum lugar em ação e definirexistingResponse
inválida como "Auto" na seção httpErrors em web.config. Agora:Se você quiser retornar o status com o conteúdo vazio de sua ação, ele será tratado como uma resposta vazia e o CEP será mostrado, portanto, há espaço para melhorar este código.
fonte
Por padrão, o IIS 7 usa mensagens de erro personalizadas detalhadas, portanto, presumo que Response.StatusCode será igual a 404.XX em vez de apenas 404.
Você pode configurar o IIS7 para usar os códigos de mensagem de erro mais simples ou modificar o código que trata das mensagens de erro mais detalhadas que o IIS7 oferece.
Mais informações disponíveis aqui: http://blogs.iis.net/rakkimk/archive/2008/10/03/iis7-enabling-custom-error-pages.aspx
Uma investigação mais aprofundada revelou que entendi errado - mensagens detalhadas não são por padrão, mas talvez tenham sido ativadas em sua caixa se você estiver vendo as diferentes mensagens de erro que mencionou.
fonte