0

我正在尝试使用 Try/Catch 来处理与数据库的潜在失败连接。Catch 部分中有一个 Response.Redirect 命令。每当页面加载时,无论 Try 部分中的代码是否失败,它都会根据 Catch 部分重定向。

如果我注释掉 Catch 部分中的 Response.Redirect 命令,页面加载得很好。同样,如果我用代码替换 Response.Redirect 命令以填充页面上的控件,假设错误被捕获,则 Try 部分成功。这是关于在 Catch 部分中有 Response.Redirect 的东西......

Private Sub Page_Load(Sender As Object, e As eventargs) Handles Me.Load

    Try
        Dim sqlcon As New System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("SarcoidsConnectionString").ConnectionString)
        Dim cmd As New System.Data.SqlClient.SqlCommand("SELECT PortalEnabled FROM [tlkSettings]", sqlcon)
        sqlcon.Open()
        Dim dbReader As System.Data.SqlClient.SqlDataReader = cmd.ExecuteReader()
        If dbReader.HasRows Then
            While dbReader.Read()
                If dbReader("PortalEnabled") = True Then
                    Response.Redirect("~/SubmitWizard.aspx")
                Else
                    Response.Redirect("~/Maintenance.aspx")
                End If
            End While
        End If
        sqlcon.Close()
    Catch ex As Exception 'Display Maintenance page if database cannot be connected to
        Response.Redirect("~/Maintenance.aspx")
    End Try

End Sub
4

2 回答 2

3

Response.Redirect()没有的第二个参数False将生成一个ThreadAbortException因为.End()Response对象上调用,所以以下几行是问题:

If dbReader("PortalEnabled") = True Then
    Response.Redirect("~/SubmitWizard.aspx")
Else
    Response.Redirect("~/Maintenance.aspx")
End If

将其更改为:

If dbReader("PortalEnabled") = True Then
    Response.Redirect("~/SubmitWizard.aspx", False)
Else
    Response.Redirect("~/Maintenance.aspx", False)
End If

to 的第二个参数Redirect()endResponse值,当将其设置为Falsethis 时,会告诉响应不要调用.End(),因此不会生成ThreadAbortException.

根据 MSDN 文档:

当您在页面处理程序中使用此方法来终止对一个页面的请求并开始对另一个页面的新请求时,请将 endResponse 设置为 false,然后调用 CompleteRequest 方法。如果为 endResponse 参数指定 true,则此方法会为原始请求调用 End 方法,该方法在完成时会引发 ThreadAbortException 异常。此异常对 Web 应用程序性能有不利影响,这就是为什么建议为 endResponse 参数传递 false 的原因。有关详细信息,请参阅 End 方法。

阅读HttpResponse.Redirect 方法文档以获取更多信息。

于 2013-11-05T16:12:59.650 回答
1

我认为问题与其他 Response.Redirect 语句有关:

If dbReader("PortalEnabled") = True Then
    Response.Redirect("~/SubmitWizard.aspx")
Else
    Response.Redirect("~/Maintenance.aspx")
End If

Response.Redirect 总是抛出一个 ThreadAbortException。这会在您的异常处理程序中捕获,因为它会捕获任何异常。要么替换 Reponse.Redirect 调用,要么添加捕获 ThreadAbortExceptions 的处理程序:

Try
    '...
Catch threadAbort As ThreadAbortException
    Throw
Catch ex As Exception
    '...
End Try

顺便说一句:您应该添加一些 Using 语句来关闭连接并可靠地释放其他对象。

于 2013-11-05T16:14:29.427 回答