2010-11-22 4 views
0

il y a des charges de ressources qui montrent comment utiliser global.ascx gestionnaire d'événements d'erreur globale pour capturer les erreurs non gérées dans l'application web mais je suis encore à trouver un bon échantillon de code à inclure dans cette méthode qui fera un rapport sur les principaux sujets comme un message d'erreur, une sortie de trace de pile, la page qui a généré l'erreur, le nom d'utilisateur/rôle qui a généré l'erreur ... et le tel.sugestions sur le gestionnaire d'erreurs global pour obtenir le vidage des données de diagnostic

Quelqu'un a-t-il utilisé, a-t-il ou a-t-il rencontré un sympathique code spinet à cette fin?

merci d'avance.

Répondre

0

Ceci est un code VB que nous utilisons, il fournit des informations détaillées pour nous de diagnostiquer la plupart des problèmes. Seul bémol avec emailing erreurs comme celui-ci est quand il y a un échec majeur, vous pouvez retrouver avec des milliers de messages dans votre boîte aux lettres :(

Dim e As Exception 

If System.Web.HttpContext.Current.Request.IsLocal Then Exit Sub 

e = System.Web.HttpContext.Current.Server.GetLastError 
If e IsNot Nothing Then 

    If TypeOf e Is HttpException Then 
     Dim he As HttpException = DirectCast(e, HttpException) 
     If he.GetHttpCode=404 Then 
      System.Web.HttpContext.Current.Server.ClearError() 
      Response.Redirect("/") 
      Exit Sub 
     End If 
    End If 

    MsgBody += "Exception: " & e.Message & vbCrLf & vbCrLf 
    MsgBody += e.ToString & vbCrLf & vbCrLf & vbCrLf 
Else 
    MsgBody += "Unknown Error" & vbCrLf & vbCrLf & vbCrLf 
End If 

If System.Web.HttpContext.Current.Request.Url Is Nothing Then 
    MsgBody += "URL: ?" & vbCrLf & vbCrLf 
Else 
    MsgBody += "URL: " & System.Web.HttpContext.Current.Request.Url.ToString & vbCrLf 
    If System.Web.HttpContext.Current.Request.RawUrl IsNot Nothing Then MsgBody += System.Web.HttpContext.Current.Request.RawUrl & vbCrLf 
    MsgBody += vbCrLf 
End If 


If System.Web.HttpContext.Current.Request.UrlReferrer Is Nothing Then 
    MsgBody += "Referer: <direct>" & vbCrLf & vbCrLf 
Else 
    MsgBody += "Referer: " & System.Web.HttpContext.Current.Request.UrlReferrer.ToString() & vbCrLf & vbCrLf 
End If 

If User IsNot Nothing Then MsgBody += "User: " & User.Identity.Name & vbCrLf 

MsgBody += "User-Agent: " & System.Web.HttpContext.Current.Request.UserAgent & vbCrLf 
MsgBody += "User-IP: " & System.Web.HttpContext.Current.Request.UserHostAddress & vbCrLf 
MsgBody += "Server: " & System.Environment.MachineName & vbCrLf 

MsgBody += vbCrLf & "RequestType: " & System.Web.HttpContext.Current.Request.RequestType() & vbCrLf & vbCrLf   

' dump request items 
' QueryString, Form, Cookies, ServerVariables 

MsgBody += "Querystring Variables ================" & vbCrLf 
If Request.QueryString.Count > 0 Then 
    For Each key As String In Request.QueryString.Keys 
     MsgBody += key & " = " & Request.QueryString(key) & vbCrLf 
    Next 
Else 
    MsgBody += "(none)" & vbCrLf 
End If 
MsgBody += vbCrLf 

MsgBody += "Form Variables =======================" & vbCrLf 
If Request.Form.Count > 0 Then 
    For Each key As String In Request.Form.Keys 
     MsgBody += key & " = " & Request.Form(key) & vbCrLf 
    Next 
Else 
    MsgBody += "(none)" & vbCrLf 
End If 
MsgBody += vbCrLf 

MsgBody += "Cookies ==============================" & vbCrLf 
If Request.Cookies.Count > 0 Then 
    For Each key As String In Request.Cookies.Keys 
     MsgBody += key & " = " & Request.Cookies(key).Value & vbCrLf 
    Next 
Else 
    MsgBody += "(none)" & vbCrLf 
End If 
MsgBody += vbCrLf 

MsgBody += "ServerVariables ======================" & vbCrLf 
If Request.ServerVariables.Count > 0 Then 
    For Each key As String In Request.ServerVariables.Keys 
     MsgBody += key & " = " & Request.ServerVariables(key) & vbCrLf 
    Next 
Else 
    MsgBody += "(none)" & vbCrLf 
End If 
MsgBody += vbCrLf   

' we send MsgBody via email using the System.Net.Mail.MailMessage & System.Net.Mail.SmtpClient classes 

' we've handled the error  
System.Web.HttpContext.Current.Server.ClearError() 

' depending on the error we redirect to our homepage /default.aspx unless that is the faulting page then redirect to static /error.html 
+0

merci, ressemble à mal commencer à convertir en C# maintenant ... – kacalapy

+0

J'ai fait quelque chose de similaire, mais j'ai passé l'information d'exception, ip, contexte de l'utilisateur à un service Web. Cela m'a permis de l'utiliser pour plusieurs sites, et m'a donné la possibilité de changer le rapport de l'email à une base de données si nécessaire. – earthling

+0

-1: désolé, mais je dois demander: pourquoi réinventer la roue et ensuite la maintenir, quand ASP .NET Health Monitoring fait tout pour vous? –

1

De votre mieux pour ne rien faire. ASP.NET Health Monitoring écrira un événement dans le journal des événements contenant la plupart des données dont vous pourriez avoir besoin.

Si ce n'est pas assez d'informations pour vous, alors vous devriez envisager d'encapsuler certaines de vos exceptions dans une exception externe qui inclut les données supplémentaires. Par exemple:

string fileSpec = " ... "; 
try 
{ 
    using (var stream = new FileStream(fileSpec)) 
    { 
     // Something 
    } 
} 
catch (IOException ex) 
{ 
    throw new Exception(String.Format("Error processing {0}", fileSpec), ex); 
} 
+1

un point majeur int eh gestionnaire d'erreur global est de courrier électronique de manière proactive les notifications d'erreurs qui est la raison pour laquelle je veux attraper des données -.. pour remplir un corps e-mail et obtenir dans la les mains des premiers répondants – kacalapy

+1

plus vous ne pouvez pas avoir accès aux journaux des événements pour obtenir cette info.Si vous le faites, c'est génial, mais parfois vous avez besoin d'autres options. – earthling

+0

Veuillez consulter ASP.NET Health Monitoring. Avec un peu plus de configuration, vous pouvez faire en sorte que ces notifications soient envoyées par courrier électronique ou stockées dans une base de données SQL Server, ou les deux. –

1

Voici ce que nous utilisons si nous voulons maintenant passer à la surveillance de la santé voir les autres réponses à cette question

public static void LogErrorWithStackTrace(String message, Exception exception, 
               EventLogEntryType entryType) 
    { 
     var context = HttpContext.Current; 
     var session = context.Session; 
     var request = context.Request; 
     var errorMessage = 
      String.Format(
       @"Message: {0} 
       Error in: {1} 
       Referer: {2} 
       Agent: {3} 
       IP: {4} 
       Request type: {5}", 
       message, request.Url, request.UrlReferrer, 
       request.UserAgent, request.UserHostAddress, request.RequestType); 
     errorMessage += "\rQuery string variables:"; 
     errorMessage = request.QueryString.Keys.Cast<string>().Aggregate(errorMessage, 
                     (current, key) => 
                     current + 
                     "\r " + key + " = " + 
                     request.QueryString[ 
                      key]); 
     errorMessage += "\rForm variables:"; 
     errorMessage = request.Form.Keys.Cast<string>().Aggregate(errorMessage, 
                    (current, key) => 
                    current + "\r " + key + 
                    " = " + 
                    request.Form[key]); 
     errorMessage += "\rCookies:"; 
     errorMessage = request.Cookies.Keys.Cast<string>().Aggregate(errorMessage, 
                    (current, key) => 
                    current + "\r " + key + 
                    " = " + 
                    request.Cookies[key]); 
     if (session != null) 
     { 
      errorMessage += "\rISession:"; 
      var sess = (ISession) session["session"]; 
      errorMessage += sess.ToString(); 
      errorMessage += "\rSession:"; 
      errorMessage = session.Keys.Cast<string>().Aggregate(errorMessage, 
                   (current, sessionKey) => 
                   current + 
                   "\r " + sessionKey + ": " + 
                   session[sessionKey]); 
     } 
     errorMessage += "\rStack Trace:"; 
     errorMessage += exception.StackTrace; 
     WriteEntry(errorMessage, entryType); 
     if (!QuietTypes.Contains(exception.GetType())) 
      SendExceptionEmail(errorMessage); 
    } 
Questions connexes