2013-08-16 21 views
16

私はMVC Webアプリケーションから詳細な400のエラー応答を返しています。 existingResponse = "PassThrough"の設定は機能しますが、それは私が望むものではありません。私はすべての失敗を明らかにしたくない、私はカスタムレスポンスを持っているときにそれらを公開したい。existingResponse = "Auto"を使用するにはどうしたらいいですか?

デフォルトは自動ですが、意図的に設定します。しかし、ドキュメントには "SetStatus"フラグを設定する必要がありますが、私はそのようなことをする方法がわかりません。私はそれをテストするために次の4つのコントローラメソッドを書いて、BadRequestDだけが動作します。他の人はステータスコードとステータスを正しく設定しましたが、本文の内容は「Bad Request」です。

public ActionResult BadRequestA() 
{ 
    Response.StatusCode = 400; 
    return Content("weeeeee"); 
} 

public ActionResult BadRequestB() 
{ 
    Response.Status = "400 U DUN MESSED UP"; 
    return Content("weeeeee"); 
} 

public ActionResult BadRequestC() 
{ 
    Response.Status = "400 U DUN MESSED UP"; 
    Response.StatusCode = 400; 
    return Content("weeeeee"); 
} 

public ActionResult BadRequestD() 
{ 
    Response.StatusCode = 400; 
    Response.TrySkipIisCustomErrors = true; 
    return Content("weeeeee"); 
} 

答えて

31

ただし、ドキュメントが「のsetStatus」フラグが設定されなければならないと言うが、私はそれが実際にfTrySkipCustomErrorsフラグ/引数話してどのように

、このようなことを行うには考えていますIIS C++ SDKのIHttpResponse::SetStatusメソッド(documentation hereの下に注記した注を参照してください)。しかしASP.NETでは、フラグはResponse.TrySkipIisCustomErrorsとして公開されています。そうに従って:

http://www.iis.net/configreference/system.webserver/httperrors

オート=のsetStatusフラグが

に設定されている場合にのみ、私はIIS、独自のHTMLエラーページのコンテンツと応答の交換を参照してくださいことを期待する応答手つかずの葉

Response.TrySkipIisCustomErrors = true; 

あなたが見ているものはどれ:あなたが設定されていない限り、デフォルトでは(あなたは、そのコンテンツが何であるかを設定することができます) ing。


追加の関連情報、MVC5でそのフラグが、それは私がWebフォームに表示されていないキャッチされない例外のために偽だ場合でも同じであるかのように行動するようです。 Global.asaxの中の回避策として、私はよ:あなたがの4xx HTTPステータスを持つカスタム応答を持っている必要があり、まだカスタムエラーページを使用する場合は

protected void Application_Error() 
{ 
    var error = Server.GetLastError(); 
    Server.ClearError(); 
    //code to log error here 
    var httpException = error as HttpException; 
    Response.StatusCode = httpException != null ? httpException.GetHttpCode() : (int)HttpStatusCode.InternalServerError; 
} 
+0

MVC5のヒントをいただきありがとうございます!私は同じ問題を抱えていて、あなたの回避策は私のために働くようです。 –

+0

ありがとうございました。答えとしてマークする必要があります。 – LaoR

0

はここにあなたが何をすべきかです:

  • セットweb.configのexistingResponse="Auto";
  • あなたの行動にはTrySkipIisCustomErrors = trueが設定されています(4xxのステータスと内容を返すアクション)。
  • Application_Error()中 - Server.ClearError())のGlobal.asaxの明確なサーバーエラーに再設定されたステータスコード(Reponse.StatusCode = ((HttpException)Server.GetLastError()).GetHttpCode()

これは、IISチームは、特定のステータスコードについてexistingResponse属性を実装していないことを奇妙だので、それはです1つ(または少数)のコードのためだけにexistingResponse="PassThrough"を使用することは不可能です。

関連する問題