Попробуйте поймать на ExecutionTimeout не работает
Этот был источником многих мучений для меня! Я использую глобальный ExecutionTimeout
110 секунд для моего приложения. Одна конкретная страница генерирует множество необработанных исключений, поскольку она содержит FileUpload
контроль.
Теперь вот проблема... Я знаю, как ограничить размер файла и время ожидания в файле web.config, используя следующие объявления.
<httpRuntime maxRequestLength="2097152" executionTimeout="600" />
Проблема у меня прямо здесь:
'Check file size
Dim fileSize As Integer
Try
fileSize = FileUpload1.FileBytes.Length
Catch ex As Exception
'Display message to user...
Exit Sub
End Try
Сам процесс проверки длины файла довольно часто выдает исключение, и это исключение не улавливается изящно в приведенном выше. try, catch
Похоже, что он откладывается до обработки исключений на уровне приложения в global.asax.
Я почти уверен, что не могу проверить размер файла на стороне клиента, я не хочу продолжать увеличивать maxRequestLength
а также executionTimeout
все, что я хочу сделать, это перехватить эти тайм-ауты на странице и показать сообщение. Это возможно?
РЕДАКТИРОВАТЬ ---
Чтобы лучше проиллюстрировать проблему, попробуйте запустить следующий код (предполагается, что значение параметра defaultTimeout равно 110 секундам).
Try
system.threading.thread.sleep(120000)
Catch ex As Exception
response.write("Error caught!!")
Exit Sub
End Try
Убедитесь, что отладка выключена. Блок захвата не будет работать, и вы получите необработанный System.Web.HttpException: Request timed out
ошибка, это я еще не выяснил?
1 ответ
Оказывается, код на странице не создает здесь исключение, поэтому он не попадает в try, catch
, Приложение отслеживает и вмешивается, когда выполнение сценария занимает слишком много времени, поэтому, когда возникает исключение на уровне приложения, мы должны отложить до global.asax.
Решение включает в себя перехват ошибки в Global.asax Application_Error
затем блок response.redirect обратно на исходную страницу с типом ошибки, добавленным к строке запроса.
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
Dim exc As Exception = Server.GetLastError
Dim context As HttpContext = DirectCast(sender, HttpApplication).Context
Dim uri As String = context.Request.Url.PathAndQuery
If uri.Contains("users/account.aspx") Then
Response.Redirect(context.Request.Url.PathAndQuery & "&err=" & exc.GetType().ToString)
End If
End Sub
Затем вы можете проверить загрузку страницы для любого err
Значение строки запроса затем отобразить ошибку соответственно на странице.