这对我来说是很多折磨的根源!我正在为我的应用程序使用 110 秒的全局ExecutionTimeout
。一个特定页面生成大量未经处理的异常,因为它包含一个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
确保调试已关闭。捕获块不起作用,您最终会遇到一个未处理的System.Web.HttpException: Request timed out
错误,我还没有弄清楚吗?
事实证明,页面上的代码并没有直接在此处抛出异常,因此为什么它没有被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
查询字符串值的页面加载,然后在页面上相应地显示错误。