httpErrors
を使用してASP.NET MVC 3アプリケーションを作成し、ユーザーにエラーメッセージなどを表示する処理をしました。そのコードはうまく動作し、以下で重複しています。コントローラで例外が発生した場合IIS7を使用してカスタムエラーページに例外を渡すhttpErrors
<httpErrors existingResponse="Replace" defaultResponseMode="ExecuteURL" errorMode="Custom">
<clear/>
<error statusCode="403" path="/Error/Forbidden" responseMode="ExecuteURL"/>
<error statusCode="404" subStatusCode="-1" path="/Error/NotFound" responseMode="ExecuteURL"/>
<error statusCode="500" subStatusCode="-1" path="/Error/ServerError" responseMode="ExecuteURL"/>
</httpErrors>
は、トリガされBaseController.OnException
(BaseController
は、私自身の創造のクラスです)。私がその機能でしたいのは、ServerErrorアクションがそのタイプとメッセージを見て、ユーザに何を表示するかを判断できるように例外を格納することです。メソッド全体が下にコピーされます。
protected override void OnException(ExceptionContext filterContext)
{
// doesn't work
this.TempData["exception"] = filterContext.Exception;
// doesn't work
this.Session["exception"] = filterContext.Exception;
// temporary hack
ErrorController.RequestExceptions[this.Request.UserHostAddress] = filterContext.Exception;
base.OnException(filterContext);
}
要求(ErrorController
が異なる名前空間にあるが、私はそれが関係ないと思う)ErrorController
インスタンスに到着すると、nullを返しますServer.GetLastError()
何らかの理由で、TempDataをが空で、セッションが空で、かつSession.IsNewSession
本当です。私は問題を回避するために、アプリケーションIDを何らかの種類のストアに格納することで解決しようとしましたが、それは存在しないように見えますが、今は私が持っている最善の解決策は、それはErrorControllerがそれを取り上げるとすぐに起こります。
これは(驚くほど)機能しますが、より安全で拡張性の高いソリューションが必要です。私はなぜTempDataがクリアされたのか、Sessionがなぜ再起動されたのか不明です - エラーのためですか?それにもかかわらず、望ましい動作を得るための回避策はありますか?
P.S.可能であれば、Application_Errorのコードではなく、web.configのhttpErrors
エントリを使用することをお勧めします。これは、よりクリーンで宣言的なソリューションのようです。
P.P.S.リダイレクト(link)中にセッションオブジェクトの問題に関する記事が見つかりましたが、問題は修正されています。私が遭遇した他の多くのものは、古いシステムについてのものでしたが、私は探し続けようとしています。
セッションがクリアされている理由上の任意のニュースを得るためにどのタイプ
HandleErrorInfo
のモデルを持っています。私はまったく同じ問題を抱えています。タンク –