В Application_Error вы можете получить доступ к ScriptManager, чтобы определить, является ли текущий запрос асинхронной обратной передачей.Глобальный объект HttpContext.Current.Handler фактически указывает на обслуживаемую страницу, которая содержит объект ScriptManager, который сообщит вам, является ли текущий запрос асинхронным.
Следующий оператор кратко иллюстрирует, как получить доступ к объекту ScriptManager.и получите эту информацию:
ScriptManager.GetCurrent(CType(HttpContext.Current.Handler, Page)).IsInAsyncPostBack
Конечно, этот оператор потерпит неудачу, если текущий запрос не для страницы или если на текущей странице нет ScriptManager, так что здесь есть более надежная парафункции, которые вы можете использовать внутри Global.asax для определения:
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
Просто вызовите IsInAsyncPostback () из Application_Error, чтобы получить логическое значение, указывающее текущее состояние.
Вы получаете универсальныйОшибки ASP.NET на клиенте, потому что попытка передать / перенаправить асинхронный запрос вызовет больше ошибок, заменяя и тем самым запутывая исходную ошибку.Вы можете использовать приведенный выше код для предотвращения передачи или перенаправления в таких случаях.
Также обратите внимание на еще одно обнаруженное мной открытие: даже если вы можете получить доступ к объекту ScriptManager, используя этот метод, по какой-то причине задайте его свойство AsyncPostBackErrorMessage из Application_Errorне работает.Новое значение не передается клиенту.Следовательно, вам все еще нужно обработать событие OnAsyncPostBackError ScriptManager в классе страницы.