попробуйте поймать 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, все, что я хочу сделать, это поймать эти тайм-ауты на странице и отобразить сообщение. Это возможно?

ИЗМЕНИТЬ ---

Чтобы лучше проиллюстрировать проблему, попробуйте запустить следующий код (предполагается, что время выполнения по умолчанию равно 110 секундам).

    Try
        system.threading.thread.sleep(120000)
    Catch ex As Exception
        response.write("Error caught!!")
        Exit Sub
    End Try

Убедитесь, что отладка отключена. Блок catch не будет работать, и вы получите необработанную ошибку System.Web.HttpException: Request timed out, это мне еще предстоит выяснить?


person QFDev    schedule 22.10.2013    source источник
comment
Так что же не так с опубликованным кодом? я не очень понимаю вашу проблему   -  person VladL    schedule 22.10.2013
comment
Я предполагаю, что за FileUpload стоит какой-то неуправляемый код, и они ускользают от попытки поймать. Но только комментарий и предположение.   -  person paparazzo    schedule 22.10.2013
comment
Проблема в том, что улов не работает. Если вы замените fileSize = FileUpload1.FileBytes.Length на System.threading.thread.sleep(120000), блок catch будет проигнорирован, и вы получите необработанную ошибку выполнения.   -  person QFDev    schedule 22.10.2013


Ответы (1)


Оказывается, код на странице не вызывает здесь исключение напрямую, поэтому он не попадает в try, catch. Приложение отслеживает и вмешивается, когда выполнение сценария занимает слишком много времени, поэтому, когда исключение возникает на уровне приложения, нам нужно отложить выполнение до global.asax.

Решение включает перехват ошибки в блоке Global.asax Application_Error, а затем ответное перенаправление обратно на исходную страницу с типом ошибки, добавленным к строке запроса.

 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, а затем соответствующим образом отобразить ошибку на странице.

person QFDev    schedule 22.10.2013