Response.StatusCodeを手動で設定した場合、IISは応答コンテンツをオーバーライドします


20

問題

私は手動で設定するとHTTP Status言って、私に応答ストリームのを、404または503、IISは代わりに私のカスタムビューのコンテンツ/ビューをIIS株式をレンダリングします。

Web開発サーバー(別名: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();
    }
}

回答:


18

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

とにかく、ここで重要なのは、200以外のステータス結果リソースを処理しないようIISに指示することです。

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

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

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

さらに情報が必要ですか?確かに、この要素の詳細については、公式のIIS Webサイトをご覧ください


httpErrorsは、エラーページ-> 500- >機能設定の編集-> "詳細なエラー"?_http://stackoverflow.com/questions/2640526/detailed-500-error-message-asp-iis-7-5_
Kiquenet

aaaahhh ..簡単なことを難しくしているIISの良さ:)
AR


-2

一般的にそのアプローチに注意してください。404ステータスのビューをレンダリングしないでください。

  • エラーステータスコードが返されると、IISは登録されているステータスエラーページを返します。処理からの出力ではありません。そのため、そこにHTMLページ(またはaspxページへのリンク)を配置できます。 http://professionalaspnet.com/archive/2008/02/13/Enforcing-a-Custom-404-Page-in-ASP.NET.aspxに は、エラーページの設定方法についてのわかりやすい説明があります。

  • しかし、それは無関係です。デフォルトでは、かなりの数のブラウザーがその出力を表示しませんが、ブラウザーに設定されたものがあります。したがって、404ページを見ている人に依存している場合は、そうはならないかもしれません。ブラウザ用にセットアップされた404ページが表示される場合があります。


1
404でビューをレンダリングしないのはなぜですか?カスタムページが必要で、ページに(静的なHTMLエラーページの代わりに)何らかのロジックが必要になる場合があります。
Pure.Krome

MVCモデルはIISエラーページモデルと統合されないためです。簡単です。そのためにIISモデルに戻る必要があります。404ケースのページURLを登録します。動的ページをそこに配置します-これが実際にMVC URLを指しているかどうかはわかりませんが、MUStは404ページの登録に由来します。
トムトム

間違っています。ほとんどのブラウザは、404 HTTPステータスで返されるページのコンテンツをレンダリングします。すべてではありませんが、ほとんど。また、IISは、パイプラインの後半で他のモジュールがオーバーライドしない限り、デフォルトで.NETサイトのコードで設定されたステータスコードを尊重します。この場合の質問の著者の回答を参照してください。
ムファサ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.