2013年10月9日水曜日

ASP.NET Global_asaxのApplication_Errorからカスタムエラーページが表示されない

1歳児のお世話をしているとブログを書く時間はないデス。
でも今日はハマったので未来の自分のためにメモです。


Global_asaxのApplication_Errorイベントで
Server.Transferでカスタムエラーページを表示しているのですが
.netのエラーページが表示されてしまい、カスタムエラーページが表示されません。
環境はVS2012,Fw3.5です。
まったく同じコードでもVS2008,Fw2.0ではちゃんと動きます。


こういうのわかりにくいから勘弁してほしい…。

ASP.NETのGlobal_asaxのコードです。
Application_Errorイベントでカスタムエラーページを表示します。
Imports System.Web.SessionState

Public Class Global_asax
    Inherits System.Web.HttpApplication

     Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        ' エラーの発生時に呼び出されます
        'カスタムエラーページを表示します。
        Server.Transfer("~/CustomError.aspx")
    End Sub

End Class


カスタムエラーページではエラー内容を表示してます。

結論いうと、Loadイベントでエラーを出力した後、Context.ClearError() を呼んであげればちゃんと動きました。
CustomError.aspx
Public Class CustomError
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim ex As Exception
        ex = Server.GetLastError
        If TypeOf ex Is HttpUnhandledException AndAlso ex.InnerException IsNot Nothing Then
            ex = ex.InnerException
        End If

        If ex IsNot Nothing Then
            Me.Label1.Text = ex.GetType.ToString
            Me.Label2.Text = ex.Message
        End If

        Context.ClearError() '<--これが必要。
    End Sub

End Class


web.configです
<system.web>
     <customErrors mode="On"/>
</system.web>

0 件のコメント: