Попробуйте поймать на 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 Значение строки запроса затем отобразить ошибку соответственно на странице.

Другие вопросы по тегам