web-dev-qa-db-ja.com

IISは、Response.StatusCodeを手動で設定した場合、応答コンテンツを上書きしています

問題

応答ストリームのHTTP Statusを手動で404または503に設定すると、IISはストックを表示しますIISカスタムビューの代わりにコンテンツ/ビュー。

これをWeb開発サーバー(AKA。 Cassini )で実行すると、正しく機能します(つまり、コンテンツが表示され、response.statuscode ==入力したデータ)。

この動作を上書きできる方法はありますか?

複製する方法

デフォルトのASP.NET MVC1 Webアプリケーションを作成します。次のルートを追加

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",
        "{*catchall}",
        new { controller = "Home", action = "Index" }
        );

}

HomeControllerのIndexメソッドを次のように置き換えます...

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        Response.StatusCode = 404;
        return View();
    }
}
21
Pure.Krome

わかりました-答えを見つけました。予想どおり、IISが200以外の応答をハイジャックしています。わからない(つまり、これがデフォルトの動作であるかどうかわからないORマシン構成などで更新されたチームメンバーの1人の設定...)。

とにかく、ここで重要なのは、tell IIS tonotnon-200 status result resources)です。

どうやって? web.configの構成エントリ。

<system.webServer>
    <httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough"/>
    .... snipped other IIS relevant elements ... 
</system.webServer>

ここでの鍵はexistingResponse="PassThrough"。その悪い子は、IISに、HTTPステータスコード!= 200の場合、リソースをそのままにするように指示します。

詳細が必要ですか?もちろん: この要素の詳細については、公式のIIS Webサイト をご覧ください)。

19
Pure.Krome

これを回避する別の方法は、ASPアプリケーションで次のコードを実行することです。

Response.TrySkipIisCustomErrors = true;

ソース: https://stackoverflow.com/a/21271085/23875

4
Sam