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()の 2 番目のパラメーターがないと、オブジェクトで呼び出されるので、次の行が問題になりますFalseThreadAbortException.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

2 番目のパラメータ toRedirect()endResponse値です。これをこれに設定するFalseと、応答が呼び出されない.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 に答える