2014-01-11 4 views
12

私たちは、ASP.NETによってスローされた例外のために以下のように私たちのカスタムエラーページを設定した:それはURLが変更されませんが保証としてリクエストの検証例外がスローされたときにカスタムエラーページを表示するには?

<customErrors mode="On" redirectMode="ResponseRewrite"> 
    <error statusCode="400" redirect="~/400.aspx"/> 
    <error statusCode="404" redirect="~/404.aspx"/> 
    <error statusCode="500" redirect="~/500.aspx"/> 
</customErrors> 

redirectMode="ResponseRewrite"を設定することが重要である(私はASP.NETがServer.Transferの代わりを行い信じますResponse.Redirect)。

残念ながら、これはリクエストの検証エラーでは機能しません。たとえば、カスタムエラーを有効にして/some/page/<script>に移動すると、ASP.NETのリクエスト検証が開始され、HttpExceptionがスローされます。しかし私のカスタムエラーページを表示する代わりに、次のメッセージが表示されます。

'/'アプリケーションでサーバーエラーが発生しました。

ランタイムエラー

説明:リクエストの処理中に例外が発生しました。 さらに、最初の例外のためにカスタム エラーページを実行している間に別の例外が発生しました。要求は終了しました。

このシナリオでASP.NETがカスタムエラーページを表示できないのはなぜですか?エラーページにはコードがありません.HTMLページだけで例外がスローされないことがわかります。

Application_ErrorでエラーをキャッチしてServer.Transferを発行すると、正常に動作するため、ASP.NETがカバーしていることが不思議です。

これを自分で処理する場合は、これ以上の解決策がありますか?

protected void Application_Error(object sender, EventArgs e) 
{ 
    var ex = Server.GetLastError() as HttpException; 
    if (ex != null 
     && ex.Message.StartsWith("A potentially dangerous Request.Path value was detected from the client") 
     && HttpContext.Current.IsCustomErrorEnabled) 
    { 
     Server.Transfer("400.aspx"); 
    } 
} 
+0

検証エラーにより400,404または500のエラーが発生することは確かですか?多分あなたの設定で扱われていない他のエラーコード – David

+0

これを理解できましたか? – Animesh

答えて

2

デフォルトのエラーページに追加できるWebアプリケーションはあなたに起こる可能性のあるエラーコードを省略しないことを確認する:

<customErrors mode="On" defaultRedirect="Error.aspx" /> 

をそして、あなたは、あなたがそれを扱うことができるよりも、唯一RequestValidationErrorsをキャッチしたい場合あなたのGlobal.asaxファイルに:

void Application_Error(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    if (ex is HttpRequestValidationException) 
    { 
     Server.ClearError(); 
     Response.Redirect("RequestValidationError.aspx", false); 
    } 
} 
0

configファイルでのcustomErrorsの設定を使用して問題が発生したリダイレクトがリダイレクトHTTPステータスコード(300セリを引き起こすことができるということですサーバーエラーHTTPステータスコード(500シリーズ)またはクライアントエラーHTTPステータスコード(400シリーズ)を実際に送信したいときに、クライアント/ブラウザに返されます。

ウェブサイトから返されたHTTPステータスコードを確認するには、[ネットワーク]タブが選択されたChromeの[その他のツール>デベロッパーツール]を使用できます。次に、Webサーバーからクライアント/ブラウザに返されたHTTPステータスコードを確認することができます。無効な電子メールアドレスのログインが入力された場合、リダイレクトステータスコード(300シリーズ)ではなくクライアントエラーステータス(HTTPステータス400シリーズ)が返されます。

質問に記載されている「ランタイム」エラーは、サーバーエラーを生成した未処理の検証条件によって発生した可能性があります。このようなエラーはさらに注意が必要ですが、HTTP応答でサーバーエラーコード(500シリーズ)を返す必要があります。

Webサーバーエラーは2つのレベルで処理されます。1つのレベルはページコンテンツ表示にあり、もう1つは返されたHTTPステータスコードにあります。理想的には、これらは互いに一致します。あなたのweb.configファイルのhttpErrorsセクションで

0
void Application_Error(object sender, EventArgs e) { 
    Exception Ex = Server.GetLastError; 
    Logger.AddNewLog(Logger.LogType.ErrorLog, sender.ToString, "Error", (Ex.Message 
        + (Environment.NewLine + Ex.StackTrace))); 
    Server.ClearError(); 
    Response.Redirect("/Error"); 
} 
0

場所existingResponse="Replace"subStatusCode="-1"

ページが400エラーとして表示され、エラーページが表示されます。

アプリケーションで


enter image description here

あなたのweb.configファイルで

enter image description here

customErrorsセクション

enter image description here
を使用する必要はありません*#8は、私は500を生成するページです目的のエラー。

関連する問題