2012-01-23 18 views
5

È possibile determinare se la richiesta corrente è un postback asincrono (aggiornamento parziale della pagina) dall'evento Application_Error?Come determinare se la richiesta corrente è un postback asincrono, in ASP.NET Evento Application_Error

Qual è il modo migliore per gestire gli errori dell'applicazione quando vengono utilizzati i postback asincroni?

In Application_Error, stiamo reindirizzando a diverse pagine di errore ma questo non funziona correttamente quando l'errore viene generato durante un postback asincrono. Abbiamo notato che questo è vero anche quando AllowCustomErrorsRedirect = false e abbiamo un gestore OnAsyncPostBackError per impostare AsyncPostBackErrorMessage. Durante i postback asincroni, il nostro AsyncPostBackErrorMessage viene sovrascritto e il client riceve invece un errore generico di pagina web.

+0

http://www.codedigest.com/Articles/ASPNETAJAX/115_Error_Handling_in_ASPNet_Ajax_Applications.aspx –

+0

Spiacente stiamo già utilizzando AllowCustomErrorsRedirect = false e fornendo AsyncPostBackErrorMessage. Quindi non vedo come l'articolo sia pertinente. Domanda aggiornata per includere l'uso del gestore OnAsyncPostBackError. – BlueFox

risposta

5

Nel metodo Application_Error non si ha più accesso diretto al controllo <asp:ScriptManager> sulla pagina. Quindi è troppo tardi per gestire l'evento AsyncPostBackError.

Se si desidera impedire un reindirizzamento, è necessario controllare la richiesta per verificare se si tratta di una richiesta asincrona. Il <asp:UpdatePanel> provoca un palo con la seguente intestazione HTTP:

X-MicrosoftAjax:Delta=true 

(vedi anche: ScriptManager Enables AJAX In Your Web Apps)

Un assegno di questa intestazione sarebbe simile a questa:

HttpRequest request = HttpContext.Current.Request; 
string header = request.Headers["X-MicrosoftAjax"]; 
if(header != null && header == "Delta=true") 
{ 
    // This is an async postback 
} 
else 
{ 
    // Regular request 
} 

Quanto a quello che sarebbe un modo appropriato per gestire l'eccezione è una domanda diversa imho.

+0

Avevo paura di esaminare l'intestazione HttpRequest sarebbe l'unica soluzione. Quanto è affidabile l'intestazione? Inoltre, questo interferirebbe con i postback a pagina intera (nessuno-asincrono)? – BlueFox

+0

L'intestazione dovrebbe essere abbastanza affidabile, poiché viene utilizzata dal framework per determinare come deve essere inviata la risposta. Non dovrebbe interferire con i post back sincroni, l'intestazione non sarà semplicemente impostata o impostata su 'Delta = false' –

+0

FYI - Questo metodo è creativo e può essere affidabile, ma è in effetti possibile accedere a ScriptManager da Application_Error. Vedi la mia risposta per i dettagli. – BrianFinkel

1

Ho avuto uno scenario simile. Ciò che ha funzionato per me è stato chiamare Server.ClearError() nel gestore di eventi per lodi ScriptManager. Ciò impedisce la chiamata alla funzione Global.asax Application_Error.

0

All'interno di Application_Error, è effettivamente possibile accedere a ScriptManager per determinare se la richiesta corrente è un postback asincrono. L'oggetto globale HttpContext.Current.Handler punta in realtà alla pagina che viene servita, che contiene l'oggetto ScriptManager, che ti dirà se la richiesta corrente è asincrona.

La seguente dichiarazione illustra sinteticamente come accedere all'oggetto ScriptManager e ottenere queste informazioni:

ScriptManager.GetCurrent(CType(HttpContext.Current.Handler, Page)).IsInAsyncPostBack 

Naturalmente, questa affermazione fallirà se la richiesta corrente non è per una pagina, o se non v'è alcun ScriptManager nella pagina corrente, ecco una coppia più robusta delle funzioni che è possibile utilizzare all'interno Global.asax per procedere alla determinazione:

Private Function GetCurrentScriptManager() As ScriptManager 
    'Attempts to get the script manager for the current page, if there is one 

    'Return nothing if the current request is not for a page 
    If Not TypeOf HttpContext.Current.Handler Is Page Then Return Nothing 

    'Get page 
    Dim p As Page = CType(HttpContext.Current.Handler, Page) 

    'Get ScriptManager (if there is one) 
    Dim sm As ScriptManager = ScriptManager.GetCurrent(p) 

    'Return the script manager (or nothing) 
    Return sm 
End Function 

Private Function IsInAsyncPostback() As Boolean 
    'Returns true if we are currently in an async postback to a page 

    'Get current ScriptManager, if there is one 
    Dim sm As ScriptManager = GetCurrentScriptManager() 

    'Return false if no ScriptManager 
    If sm Is Nothing Then Return False 

    'Otherwise, use value from ScriptManager 
    Return sm.IsInAsyncPostBack 
End Function 

Basta chiamare IsInAsyncPostback() dall'interno Application_Error per ottenere un valore booleano che indica lo stato attuale .

Stai ricevendo errori ASP.NET generici sul client perché il tentativo di trasferire/reindirizzare una richiesta asincrona genererà più errori, sostituendo e quindi offuscando l'errore originale. È possibile utilizzare il codice sopra per impedire il trasferimento o il reindirizzamento in tali casi.

Nota anche un'altra scoperta che ho effettuato: anche se è possibile accedere all'oggetto ScriptManager utilizzando questo metodo, per qualche motivo l'impostazione della proprietà AsyncPostBackErrorMessage da Application_Error non funziona. Il nuovo valore non viene passato al client. Pertanto, sarà comunque necessario gestire l'evento OnAsyncPostBackError di ScriptManager nella classe di pagine.

Problemi correlati