99

ここで奇妙な問題が発生します。customErrorsweb.config のセクションを使用してカスタム エラー ページを作成する場合は、適切な値に設定する必要があることは誰もが知っていResponse.StatusCodeます。たとえば、カスタム 404 ページを作成して 404.aspx という名前を付けた場合<% Response.StatusCode = 404 %>、コンテンツを挿入して真の 404 ステータス ヘッダーを持たせることができます。

ここまでフォロー?良い。IIS7 でこれを実行してみます。私はそれを機能させることができません、ピリオド。カスタム エラー ページで が設定されている場合Response.StatusCode、IIS7 はカスタム エラー ページを完全に上書きするように見え、独自のステータス ページを表示します (構成されている場合)。

他の誰かがこの動作を見て、おそらくそれを回避する方法を知っていますか? IIS6で動作していたので、なぜ変わったのかわかりません。

注: これは、404 Not Found の代わりに 200 OK を返す ASP.NET カスタム 404の問題とは異なります。

4

7 に答える 7

117

system.webServer/httpErrors セクションで、existingResponse を PassThrough に設定します。

  <system.webServer>
    <httpErrors existingResponse="PassThrough" />
  </system.webServer>

existingResponse プロパティのデフォルト値は Auto です:

Auto は、カスタム エラー モジュールに正しいことを行うように指示します。クライアントに表示される実際のエラー テキストは、呼び出しで返される fTrySkipCustomErrors の値に応じて影響を受けIHttpResponse::GetStatusます。fTrySkipCustomErrors が true に設定されている場合、カスタム エラー モジュールは応答を通過させますが、false に設定されている場合、カスタム エラー モジュールはテキストを独自のテキストに置き換えます。

詳細: IIS7 カスタム エラー モジュールに期待されること

于 2009-03-31T20:07:21.467 に答える
82

動作を一貫させる最も簡単な方法は、エラーをクリアしてResponse.TrySkipIisCustomErrorsを使用し、それをtrueに設定することです。これにより、ページ内またはApplication_ErrorのグローバルエラーハンドラーからのIISグローバルエラーページ処理が上書きされます。

Server.ClearError();
Response.TrySkipIisCustomErrors = true;

通常、これは、アプリケーションエラーハンドラーがキャッチしていないすべてのエラーを処理するApplication_Errorハンドラーで実行する必要があります。

より詳細な情報は、このブログ投稿にあります: http ://www.west-wind.com/weblog/posts/745738.aspx

于 2009-05-01T22:34:45.503 に答える
11

解決済み: IIS7 がエラー ページを「パススルー」するには、「詳細なエラー」をオンにする必要があることがわかりました。http://forums.iis.net/t/1146653.aspxを参照してください。

于 2009-01-12T09:41:07.387 に答える
4

これが本質的に似ているかどうかはわかりませんが、表面的には似ているように聞こえる問題を解決しました。

まず、カスタム 404、400、および 500 があるため、existingResponse (Auto) のデフォルト値が私の場合の正解でした (他にも作成できますが、これら 3 つで十分です)。これが私を助けた関連セクションです。

web.config から:

<customErrors mode="Off" />

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/errors/404.aspx" responseMode="ExecuteURL" />
  <error statusCode="500" path="/errors/500.aspx" responseMode="ExecuteURL" />
  <error statusCode="400" path="/errors/400.aspx" responseMode="ExecuteURL" />
</httpErrors>

そこから、これを global.asax の Application_Error に追加しました。

    Response.TrySkipIisCustomErrors = True

カスタム エラー ページのそれぞれに、正しい応答ステータス コードを含める必要がありました。私の場合、カスタム 404 を使用してユーザーをサイトのさまざまなセクションに誘導しているので、実際にデッド ページでない限り 404 ステータス コードを返したく ありません。

とにかく、それが私がやった方法です。それが誰かを助けることを願っています。

于 2013-07-31T12:44:48.700 に答える
3

この問題は大きな頭痛の種でした。前述の提案はどれも単独では解決できなかったので、私の解決策を含めます。記録のために、私たちの環境/プラットフォームは以下を使用します:

  • .NET フレームワーク 4
  • MVC3
  • IIS8 (ワークステーション) および IIS7 (Web サーバー)

具体的には、(Web.config 設定を介して) カスタム 404 ページにユーザーをリダイレクトする HTTP 404 応答を取得しようとしていました。

まず、私のコードはHttpException. コントローラーからa を返すことNotFoundResultは、私が望んでいた結果を達成しませんでした。

throw new HttpException(404, "There is no class with that subject");

次に、Web.config でとノードの両方を構成する必要がありました。customErrorshttpError

<customErrors mode="On" defaultRedirect="/classes/Error.aspx">
  <error statusCode="404" redirect="/classes/404.html" />
</customErrors>

...

<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
  <clear />
  <error statusCode="404" path="/classes/404.aspx" responseMode="ExecuteURL" />
</httpErrors>

existingResponseasを残したことに注意してくださいAuto。これは、@sefl が提供するソリューションとは異なります。

このcustomErrors設定は、明示的にスローされた を処理するために必要なように見えましたがHttpExceptionhttpErrorsノードは Globals.asax.cs で指定されたルート パターンの範囲外の URL を処理していました。

PSこれらの設定では、設定する必要はありませんでしたResponse.TrySkipIisCustomErrors

于 2014-02-26T19:34:48.923 に答える
0

デフォルトでは、IIS 7 は詳細なカスタム エラー メッセージを使用するため、Response.StatusCode は単なる 404 ではなく 404.XX になると想定します。

より単純なエラー メッセージ コードを使用するように IIS7 を構成するか、IIS7 が提供するより詳細なエラー メッセージを処理するコードを変更することができます。

ここで入手可能な詳細情報: http://blogs.iis.net/rakkimk/archive/2008/10/03/iis7-enabling-custom-error-pages.aspx

詳細なメッセージはデフォルトでは表示されませんが、前述の別のエラー メッセージが表示されている場合は、ボックスでオンになっている可能性があります。

于 2009-01-12T02:53:21.967 に答える