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.
http://www.codedigest.com/Articles/ASPNETAJAX/115_Error_Handling_in_ASPNet_Ajax_Applications.aspx –
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