Quero uma página de erro personalizada mostrada para 500, 404 e 403. Aqui está o que fiz:
Ativou erros personalizados no web.config da seguinte maneira:
<customErrors mode="On" defaultRedirect="~/Views/Shared/Error.cshtml"> <error statusCode="403" redirect="~/Views/Shared/UnauthorizedAccess.cshtml" /> <error statusCode="404" redirect="~/Views/Shared/FileNotFound.cshtml" /> </customErrors>
Registrado
HandleErrorAttribute
como um filtro de ação global naFilterConfig
classe da seguinte maneira:public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CustomHandleErrorAttribute()); filters.Add(new AuthorizeAttribute()); }
Criou uma página de erro personalizada para cada uma das mensagens acima. O padrão para 500 já estava disponível imediatamente.
Declarado em cada visualização de página de erro personalizada que o modelo para a página é
System.Web.Mvc.HandleErrorInfo
Para 500, mostra a página de erro personalizada. Para outros, não.
Há algo que estou perdendo?
Parece que isso não é tudo o que há para exibir erros personalizados à medida que leio o código no OnException
método da HandleErrorAttribute
classe e está lidando com apenas 500.
O que preciso fazer para lidar com outros erros?
fonte
Respostas:
Minha configuração atual (no MVC3, mas acho que ainda se aplica) depende de uma
ErrorController
, então eu uso:E o controlador contém o seguinte:
E as visualizações do jeito que você as implementa. Porém, costumo adicionar um pouco de lógica, para mostrar o rastreamento de pilha e as informações de erro, se o aplicativo estiver no modo de depuração. Então, Error.cshtml se parece com isso:
fonte
redirectMode="ResponseRewrite"
sobre oCustomerErrors
elemento//you may want to set this to 200
no código. NÃO FAÇA ISSO!Eu fiz a solução pablo e sempre tive o erro (MVC4)
Para se livrar disso, remova a linha
em FilterConfig.cs
fonte
Eu faço algo que requer menos codificação do que as outras soluções postadas.
Primeiro, no meu web.config, tenho o seguinte:
E o controlador (/Controllers/ErrorPageController.cs) contém o seguinte:
E, finalmente, a exibição contém o seguinte (simplificado, mas pode conter:
É tão simples quanto isso. Ele pode ser facilmente estendido para oferecer informações de erro mais detalhadas, mas o ELMAH lida com isso para mim e o statusCode & statusDescription é tudo o que geralmente preciso.
fonte
Parece haver uma série de etapas aqui misturadas. Vou apresentar o que fiz do zero.
Crie o
ErrorPage
controladorAdicione visualizações para essas duas ações (clique com o botão direito do mouse -> Adicionar exibição). Eles devem aparecer em uma pasta chamada ErrorPage.
Dentro
App_Start
abraFilterConfig.cs
e comente o filtro de tratamento de erros.Dentro do web.config, adicione o seguinte
<customerErrors>
entradas, emSystem.Web
Teste (claro). Lance uma exceção sem tratamento no seu código e veja-a ir para a página com o ID 500 e, em seguida, use um URL para uma página que não existe para ver 404.
fonte
An exception occurred while processing your request. Additionally, another exception occurred while executing the custom error page for the first exception. The request has been terminated.
Tudo o que peguei no seu código está no arquivo web.config, adicionei<error redirect = "~/ControllerName/ActionName" statusCode="404"/>
e funcionou bem :) O restante do código foi da resposta de @ Pablo. Eu estou usando MVC 5 e estrutura de entidade 6. Eu não removeufilters.Add(new HandleErrorAttribute())
a partirFilterConfig.cs
Eu recomendaria usar o arquivo Global.asax.cs.
fonte
Com base na resposta postada por maxspan, montei um projeto de amostra mínimo no GitHub mostrando todas as partes de trabalho.
Basicamente, apenas adicionamos um
Application_Error
método ao global.asax.cs para interceptar a exceção e nos dá a oportunidade de redirecionar (ou mais corretamente, solicitar a transferência ) para uma página de erro personalizada.Controlador de erro:
Visualização da página de erro:
Nada mais está envolvido, além de desabilitar / remover
filters.Add(new HandleErrorAttribute())
no FilterConfig.csEmbora seja muito simples de implementar, a única desvantagem que vejo nessa abordagem é usar a string de consulta para fornecer informações de exceção à página de erro de destino.
fonte
Eu tinha tudo configurado, mas ainda não conseguia ver as páginas de erro apropriadas para o código de status 500 em nosso servidor intermediário, apesar de tudo ter funcionado bem nos servidores de desenvolvimento local.
Encontrei esta postagem no blog de Rick Strahl que me ajudou.
Eu precisava adicionar
Response.TrySkipIisCustomErrors = true;
ao meu código de tratamento de erros personalizado.fonte
Aqui está a minha solução. Use [ExportModelStateToTempData] / [ImportModelStateFromTempData] é desconfortável na minha opinião.
~ / Views / Home / Error.cshtml:
~ / Controladores / HomeController.sc:
~ / Controladores / BaseController.sc:
~ / Controladores / MyController.sc:
Desejo-lhe projetos de sucesso ;-)
fonte
Você pode obter erros funcionando corretamente sem hackear o global.cs, mexendo com HandleErrorAttribute, executando Response.TrySkipIisCustomErrors, conectando Application_Error ou o que quer que seja:
No system.web (apenas o habitual, ativado / desativado)
e em system.webServer
Agora, as coisas devem se comportar conforme o esperado, e você pode usar o ErrorController para exibir o que precisar.
fonte
Parece que cheguei atrasado à festa, mas é melhor você também conferir isso.
Portanto,
system.web
para armazenar em cache exceções no aplicativo, como return HttpNotFound ()e
system.webServer
para recuperar erros que foram capturados pelo IIS e não chegaram à estrutura asp.netNo último, se você se preocupar com a resposta do cliente, altere
responseMode="Redirect"
pararesponseMode="File"
e sirva um arquivo html estático, pois este exibirá uma página amigável com um código de resposta 200.fonte
No web.config, adicione isso na tag system.webserver como abaixo,
e adicione um controlador como,
e adicionar suas visões respeitadas, isso funcionará definitivamente, eu acho que para todos.
Esta solução foi encontrada em: Neptune Century
fonte