2016-07-10 48 views
8

Sto tentando di eseguire un'applicazione ASP.NET che registra le eccezioni nel database. Sto usando Application_Error per catturare l'eccezione.Application_Error() non attivo

Prima di aggiungere la stringa di connessione, solo per testare il mio codice (classe Logger e il codice in Global.asax), ho provato a registrare l'errore nel visualizzatore eventi di Windows. Funziona come previsto.

Ma dopo aver aggiunto la stringa di connessione al file Web.config e aggiunto il codice ADO.NET, ho provato a eseguire l'applicazione. Ma ottengo lo schermo giallo della morte: D

Non so cosa c'è di sbagliato nel mio codice. Ho solo modificato l'elemento connectionStrings nel file Web.config e aggiunto il codice ADO.NET.

Ecco il codice.

Questo è il codice del modulo Web nell'evento Page_Load. Il file Countries.xml non è presente e si prevede che genererà un errore.

DataSet dataset = new DataSet(); 
dataset.ReadXml(Server.MapPath("~/Countries.xml")); 
GridView1.DataSource = dataset; 
GridView1.DataBind(); 

Application_Error

Exception exception = Server.GetLastError(); 
if (exception != null) 
{ 
Logger.Log(exception); 
Server.ClearError(); 
Server.Transfer("~/Errors.aspx"); 
} 

Web.config

<configuration> 
<connectionStrings> 
    <add name="DBCS" connectionString="Data Source=.;database=Sample;Integrated Security=SSPI" providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
<system.web> 
<compilation debug="true" targetFramework="4.5.2" /> 
</system.web> 
</configuration> 

Ho provato debug inserendo un punto di interruzione alla Application_Error in Global.asax, ma il controllo non raggiunge tale punto. L'eccezione viene attivata dall'evento Page_Load. Non ci sono errori di compilazione nel codice della classe Logger. Inoltre, non voglio usare la rotta CustomErrors per risolvere questo problema.

Grazie in anticipo.

Questo è il link al codice: https://drive.google.com/folderview?id=0B5K22Q9r50wXU0VOQmJKVHBoaDg&usp=sharing

+0

Si sta attuando una pagina di errore personalizzata troppo? Hai verificato di non avere altre istruzioni try-catch che abbiano permesso di rilevare l'eccezione prima del tuo codice Application_Error? –

+0

Ciao @Ephraim, sì sto implementando una pagina di errore personalizzata: Errors.aspx. Non c'è altro blocco catch try nel mio codice. L'eccezione non viene gestita e vedo lo schermo giallo della morte. – Nachiket

risposta

0

Avete abilitato errori personalizzati sul web.config?

<system.web> 
    ... 
    <customErrors mode="RemoteOnly" defaultRedirect="~/Errors.aspx" redirectMode="ResponseRewrite" /> 
    ... 
</system.web> 

noti che la modalità di reindirizzamento 'ResponseRewrite' in modo da preservare l'eccezione Server.GetLastError(). Se si imposta diversamente, allora Server.GetLastError() restituirà null.

Implementazione Application_Error dovrebbe essere facile .. in Global.asax

protected void Application_Error(Object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    if (ex is ThreadAbortException) 
     return; // Redirects may cause this exception.. 
    Logger.Error(LoggerType.Global, ex, "Exception"); 
    Response.Redirect("unexpectederror.htm"); 
} 

UPDATE:

Una possibile colpevole sarebbe il HandlerErrorAttribute registrato come filtro nel Global.asax.

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); // this line is the culprit 
} 

Semplicemente commento o rimuovere la linea e assicurarsi di aver implementato le customErrors nel system.web sotto web.config.

Non ho familiarità con HandleErrorAttribute, se questo risolve il problema, allora potrebbe anche cercare la sua documentazione.

+0

Ciao @Ephraim, il tuo approccio funzionerà e questo mi aiuterà a cogliere l'eccezione. Ma allora cosa c'è di sbagliato nel codice e nell'approccio che sto usando, è la mia domanda. L'Application_Error dovrebbe essere attivato quando l'eccezione non viene gestita utilizzando un blocco try-catch o a livello di pagina. Allora, perché non funziona? – Nachiket

+0

@Nachiket Ho aggiornato la mia risposta. Probabilmente la firma del metodo per Application_Error è errata da qualche parte. Ho pubblicato un esempio. –

+0

No, la firma del metodo è la stessa. Ho provato il tuo codice. Ma il controllo non raggiungerà il metodo Application_Error. Ho persino cambiato il valore della modalità customErrors da remote Only a on, ma ancora nessuna modifica. Voglio dire, vengo indirizzato alla pagina Errors.aspx, ma Application_Error non viene attivato. – Nachiket

1

Se hai <customErrors mode="Off" /> mentre debug, il codice non raggiungerà a Application_Error evento perché eccezione viene visualizzato all'interno del browser subito.

Se si vuole raggiungere Application_Error durante il debug, si desidera abilitare errore personalizzato -

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

Ciao @Win, ci ho provato. Ma il controllo non raggiunge mai il metodo Application_Error. Anche se sono reindirizzato alla pagina Errors.aspx – Nachiket

+1

sì, che diamine è Application_Error per poi – Toolkit

Problemi correlati