31

そのため、MVC Web アプリから詳細な 400 エラー応答を返しています。existingResponse="PassThrough" の設定は機能しますが、それは私が望むものではありません。すべての失敗を公開したくはありません。カスタム応答がある場合にのみ公開したいと考えています。

デフォルトでは自動ですが、あえて設定しています。ただし、ドキュメントには「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");
}
4

2 に答える 2

46

ただし、ドキュメントには「SetStatus」フラグを設定する必要があると書かれていますが、そのようなことを行う方法がわかりません

実際には、IIS C++ SDKfTrySkipCustomErrorsのメソッドへのフラグ/引数について話しています (ここのドキュメントの最後に追加したメモを参照してください)。しかし、ASP.NET では、フラグは として公開されます。したがって、次のとおりです。IHttpResponse::SetStatusResponse.TrySkipIisCustomErrors

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

Auto = SetStatus フラグが設定されている場合にのみ、応答をそのままにします

次のように設定しない限り、デフォルトで IIS が応答を独自の HTML エラー ページ コンテンツ (そのコンテンツを構成できます) に置き換えることが期待されます。

Response.TrySkipIisCustomErrors = true;

これはあなたが見ているものです。


追加の関連情報。MVC5 では、WebForms では見られないキャッチされていない例外に対して false であっても、そのフラグが true であるかのように動作するようです。Global.asax の回避策として、私は次のようにしています。

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;
}
于 2014-01-21T23:18:09.043 に答える