0

VB.NET で作業していて、500 エラー処理に問題があります。

私の問題は、500 エラーがスローされると、サイトがエラー ページにリダイレクトされることです。しかし、Chrome の [ネットワーク] タブを調べると、エラーをスローしたページで 200 (OK) が返され、リダイレクト先のページで別の 200 が返されることがわかります。

エラーをスローしたページでは 500 エラーが返され、リダイレクトされたページでは 200 が返されると考えてよろしいですか?

私の Web 構成のエラー処理は次のように設定されています。

<customErrors defaultRedirect="~/error.aspx" mode="On">
      <error statusCode="400" redirect="~/400Error.aspx" />
      <error statusCode="500" redirect="~/error.aspx?code=500" />
    </customErrors>

<httpErrors errorMode="Custom" existingResponse="Replace">
      <clear />
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" prefixLanguageFilePath="" path="/error.aspx" responseMode="ExecuteURL" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="500" prefixLanguageFilePath="" path="/error.aspx?code=500" responseMode="ExecuteURL" />
      <remove statusCode="400" subStatusCode="-1" />
      <error statusCode="400" prefixLanguageFilePath="" path="/400Error.aspx" responseMode="ExecuteURL" />
    </httpErrors>

しかし、これだけでも、上で説明した問題が発生します。

Global.asax ファイルの Application_Error のいずれかを使用して、ページに 500 を返すことができるのではないかと考えました。

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Response.StatusCode = System.Net.HttpStatusCode.InternalServerError
        Server.ClearError()
        Server.Transfer("error.aspx?code=500")
    End Sub

または、マスター ページに同様のコードを追加して、ページ レベルで:

 Protected Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Error
        Response.StatusCode = System.Net.HttpStatusCode.InternalServerError
        Server.ClearError()
        Server.Transfer("error.aspx?code=500")
    End Sub

ページ レベルでエラーをキャッチすると、エラー ページにリダイレクトされ、web.config ファイルでエラーを処理した場合と同じ結果が得られます。アプリケーション レベルでエラーをキャッチすると、リダイレクト (?) を実行せずにエラー ページが返されるように見えますが、この場合は 200 が 1 つだけ返されます。

上記のコードの組み合わせを試してみました - Server.ClearError() が web.config レベルへの「バブルアップ」からエラーを停止することを理解していますか? しかし、私はその行の有無にかかわらず試してみましたが、あまり成功しませんでした.

エラーをスローするページで 500 を返すのが正しいかどうか、もしそうなら、これを達成するために何ができるか教えてもらえますか?

4

1 に答える 1

0

アプリケーションレベルで例外をスローすると、リダイレクトせずにエラーページを返し、500エラーを返すという結果が得られることがわかりました。

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim ex = Server.GetLastError()
        //log error details
        Response.StatusCode = System.Net.HttpStatusCode.InternalServerError
        Server.ClearError()
        Throw New Exception
    End Sub

これが私の問題を解決する最良の方法であるかどうかはわかりませんが、他の誰かがこれが役立つと思った場合に備えて、残しておきます。

于 2012-08-16T12:50:16.210 に答える