Pergunta

Foi perguntando o que você pensou desta solução, se este é o caminho certo para passar uma mensagem de erro para uma página personalizada?

Em web.config:

    <customErrors mode="On" defaultRedirect="~/Error.aspx"></customErrors>

Em Global.asax:

<script RunAt="server">
    void Application_Error(object sender, EventArgs e)
    {
    Exception ex = Server.GetLastError();
    if (ex != null && Session != null)
    {
        ex.Data.Add("ErrorTime", DateTime.Now);
        ex.Data.Add("ErrorSession", Session.SessionID);
        HttpContext.Current.Cache["LastError"] = ex;
    }
    }

</script>

Em meus Error.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;

    if (HttpContext.Current.Cache["LastError"] != null)
    {
        Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
        if (ex.Data["ErrorTime"] != null && ex.Data["ErrorSession"] != null)
            if ((DateTime)ex.Data["ErrorTime"] > DateTime.Now.AddSeconds(-30d) && ex.Data["ErrorSession"].ToString() == Session.SessionID)
                Label1.Text = ex.InnerException.Message;
    }
}

de Emissão: Eu não quero fazer um Server.Transfer de Global.asax porque .. Eu não sei. Parecia desajeitado para mim. Quer ser capaz de mudar customErrors para RemoteOnly. Então tem que salvar último lugar exceção, mas não pode ser Session, para salvar a cache, mas com alguns dados extras (tempo e SessionID) desde Cache é global e quer ter certeza de não mostrando erro errado com alguém.


Eu mudei meu código um pouco. Agora é só:

void Application_Error(object sender, EventArgs e)
{
    HttpContext.Current.Cache["LastError"] = Server.GetLastError().GetBaseException();
    Server.ClearError();
}

... e ...

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;

    if (HttpContext.Current.Cache["LastError"] != null)
    {
        Exception ex = (Exception)HttpContext.Current.Cache["LastError"];
        if (ex != null)
            Label1.Text = ex.Message;
    }
}

Nota SessionID não existe se o usuário anônimo, e ex.Data.Add uma chave que já está lá fará com que erro me fazendo perceber que é importante chamar ClearError

Foi útil?

Solução

Eu acho que é uma maneira decente para fazê-lo. Não é a maneira que eu fazê-lo, mas meu código é muito demorado para pós (e em VB.NET).

Uma coisa que eu mudaria é a página de erro em si. Em vez de exibir o erro, considere adicionar uma caixa de texto para a página de erro como um campo opcional onde o usuário pode inserir seu endereço de e-mail e clicar em um botão para enviar o relatório de erro para você. Então, quando você receber o relatório de erro que você pode olhar para o problema e responder a eles. É uma maneira amigável, muito mais fácil de fazer isso e tem funcionado muito bem para os sites que eu fiz isto.

Ao longo destas linhas, você pode também querer reunir dados de formulários, os dados da sessão, e qualquer outra coisa de valor e colocá-la no relatório de erro também. Isso pode fazer o diagnóstico de problemas muito mais fácil.

Outras dicas

Nós fazemos algo que pode ou não pode trabalhar para você. Fazemos logging extensa no DB. Quando teremos um erro, nós registrá-lo e que produz um ID de erro. Nós redirecionar para a página genérica com a ID de erro e obter os detalhes lá.

é claro que isso cai de cara no chão quando o erro é 'não pode se conectar ao DB', mas isso não acontece com muita freqüência;)

Como o cache é global isso não seria aconselhável, como você disse que você poderia estar exibindo o erro errado com alguém. Gostaria também de dizer que você não deve saída a mensagem de erro diretamente aos usuários finais por razões de segurança.

Tenha um olhar para esta questão:

ASP.NET personalizada do servidor página de erro GetLastError é nulo

Para resumir colocar algo como o seguinte:

Server.Transfer(String.Concat("~/Error.aspx?message=", HttpUtility.UrlEncode(ex.InnerException.Message)))

Ao invés de confiar em ASP.NET para fazer o redirecionamento usando as configurações na seção CustomErrors.

Eu teria que concordar com ambos n8wrl e Steve que uma abordagem melhor seria a erros no banco de dados de log e, em seguida, retornar apenas uma ID de erro para o usuário. Eles realmente não precisam para ver os detalhes técnicos e é possível que este irá expor informações confidenciais.

No nosso caso, nós também passar no ID do usuário (se disponível) e a página onde ocorreu o erro (Request.Url ainda é bom quando você chegar ao Application_Error global). Desta forma, podemos rastrear o erro um pouco mais fácil. Note também que você não tem que usar Global.asax com uma tag script. Se você criar um arquivo Global.asax.cs em seu diretório App_Code, você pode apenas codificar seu C # diretamente (pode depender do tipo de projeto, embora).

Server.ClearError();

Esta linha deve ser colocado em Error.aspx.cs depois de exibir ErrorMessage eu acho.

Eu estava encarregado de criar uma página de erro personalizada. Tudo era muito simples: no arquivo web.config eu tinha:

<customErrors mode="On">
<error statusCode="404" redirect="~/error-pages/page-not-found.aspx?error=1"
</customErrors>

e no Global.asax, no método Application_Error: algum código ...

Server.Transfer("~/error-pages/error.aspx");

Na página de erro personalizada "error.aspx": Server.ClearError();

Eu não sei exatamente o que foi modificado, mas isso não funcionou mais. Quando o código alcançou o método Server.Transfer, uma exceção foi sempre levantada: Erro ao executar pedido subordinado para a página ...

Eu olhei para algumas soluções e finalmente encontrei este. Eu modifiquei meu código, e agora parece funcionar:

<customErrors mode="On" defaultRedirect="~/error-pages/error.aspx">
  <error statusCode="404" redirect="~/error-pages/page-not-found.aspx?error=1" />
</customErrors>

e no método global.asax:

Session["LastError"] = Server.GetLastError();

Ele também trabalhou com o Cache [ ""] código, mas eu preferiu a variável de sessão.

Então, obrigado pelas respostas.

  • não se esqueça de limpar o erro na página de erro personalizada. Isso é importante. Além disso, ele seria indicado para não mostrar exatamente tudo o erro para o usuário. Talvez em um formato amigável determinado usuário. E dar todas as informações em um arquivo de log, ou enviá-lo via e-mail ou qualquer outra coisa.

Espero que isso foi útil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top