2009-02-24 8 views
11

Sto inviando i dettagli di un'eccezione non gestita da global.asax. Come posso ottenere il percorso e/o il nome file del file aspx o del file assembly in cui non è stata gestita un'eccezione.Eccezioni non gestite con Global.asax

Questa informazione si presentava nello stack stack dell'eccezione quando stavo sviluppando il test &. Quando ho distribuito global.asax in produzione, queste informazioni non vengono più visualizzate nello stack trace.

C'è un modo per ottenere queste informazioni mentre creo il mio oggetto MailMessage in Global.asax?

Grazie

risposta

12

Se questa è un'applicazione ASP.NET, che il tag lo suggerisce, dovresti essere in grado di fare qualcosa di simile ... Il ctx.Request.Url.ToString() ti darebbe il nome del file di dove l'errore si è verificato

protected void Application_Error(object sender, EventArgs e) 
{ 
    MailMessage msg = new MailMessage(); 
    HttpContext ctx = HttpContext.Current; 

    msg.To.Add(new MailAddress("[email protected]")); 
    msg.From = new MailAddress("[email protected]"); 
    msg.Subject = "My app had an issue..."; 
    msg.Priority = MailPriority.High; 

    StringBuilder sb = new StringBuilder(); 
    sb.Append(ctx.Request.Url.ToString() + System.Environment.NewLine); 
    sb.Append("Source:" + System.Environment.NewLine + ctx.Server.GetLastError().Source.ToString()); 
    sb.Append("Message:" + System.Environment.NewLine + ctx.Server.GetLastError().Message.ToString()); 
    sb.Append("Stack Trace:" + System.Environment.NewLine + ctx.Server.GetLastError().StackTrace.ToString()); 
    msg.Body = sb.ToString(); 

    //CONFIGURE SMTP OBJECT 
    SmtpClient smtp = new SmtpClient("myhost"); 

    //SEND EMAIL 
    smtp.Send(msg); 

    //REDIRECT USER TO ERROR PAGE 
    Server.Transfer("~/ErrorPage.aspx"); 
} 
+0

Fantastico. Grazie! –

+0

HttpContext.Current.Url fornisce l'URL corrente. Ma la domanda ha richiesto il percorso e/o il nome del file dell'assembly. – RoadWarrior

+0

@RoadWarrior: Poiché si tratta di un'applicazione ASP.NET, è probabile che l'URL sia sufficientemente buono. Dal momento che ha accettato la risposta, suppongo che soddisfi i suoi bisogni. – RSolberg

0

in Visual Studio, è necessario impostare il build di rilascio per generare simboli di debug. Diversamente dalla build di debug, questo non è impostato di default. Questo ti darà la traccia completa dello stack di eccezioni.

Anche in questo caso, le ottimizzazioni eseguite dal compilatore JIT (come l'inlining) possono significare che non si ottiene il numero di linea corretto nella traccia dello stack. Se si vuole essere sicuri del numero di riga, è anche possibile impostare la versione di rilascio su "nessuna ottimizzazione". Ma questo può significare che la tua app ha prestazioni e/o velocità di trasmissione inferiori (quest'ultima tende ad essere più importante in un'app web).

EDIT: È possibile trovare l'impostazione "Genera simboli di debug" andando alla finestra Esplora soluzioni, facendo clic con il pulsante destro del mouse sul progetto e scegliendo la voce di menu "Proprietà". Quindi vai su Proprietà di configurazione> Crea> Genera informazioni di debug e imposta su vero o falso. L'impostazione Codice Optimize si trova nella stessa finestra.

+0

Come è fatto? –