IIS7はResponse.StatusCodeを設定するときにcustomErrorsをオーバーライドしますか?


98

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

これまでに私に従ってください?良い。これをIIS7で実行してみます。うまくいきません。Response.StatusCodeがカスタムエラーページで設定されている場合、IIS7はカスタムエラーページを完全に上書きするようで、独自のステータスページを表示します(設定されている場合)。

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

注:これは、404 Not Foundの代わりに200 OKを返すASP.NETカスタム404の問題と同じではありません。



ボビー、私は実際にその質問を見つけて試してみましたが、問題は解決しませんでした。しかし、ありがとう。
ニコラス

この問題は、ClassicからIntegrated pipeineに切り替えるときにも発生することをコメントしておきます。@PavelChuchuvaソリューションを使用しました(@RickStrahlソリューションも機能します)。私は...クラシックで「パススルー」は、サーバのグローバルエラーページの取り扱いを要する統合では、自動で推測している
sonjz

回答:


116

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

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

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

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

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


3
existingResponseをPassThroughに設定すると、副作用が発生する可能性があることに注意してください。変更する前に、Pavelが提供するリンクをマスターしてください。
Lex Li

です <httpErrors existingResponse="PassThrough" />と同等Response.TrySkipIisCustomErrorsか、彼らは異なる動作をしますか?
アスビョルンUlsberg

1
@sbjornu同じことを実現しResponse.TrySkipIisCustomErrorsますが、IISカスタムエラーを表示するタイミングをより適切に制御できます。
Pavel Chuchuva

ありがとう、response.tryskipiiscustomerrorsに関する多くの情報を見ましたが、既存の応答についてはそれほどではありません。
HBCondo

IIS7を実行しているWebホストでカスタムエラーページが機能しない問題を単純にexistingResponse = "Auto"に設定することで解決しました。これは、記事がデフォルトであるクレームを参照しているため、非常に驚​​きました。それは明らかにそうではありません...または私のホスティング会社は他の場所で間違ったデフォルトを設定していると思います。どちらにしても、誰かが数時間節約できると思います:\
Eric Sassaman 2013

80

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

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

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

詳細については、このブログの投稿をご覧ください。http//www.west-wind.com/weblog/posts/745738.aspx


2
これも私(IIS8)では機能せず、アドバイスがOPと一致していないようです(私が正しく読んでいると仮定します)。私が欲しいcustomErrorのトリガーにWeb.configファイルで構成されました。Response.TrySkipIisCustomErrors = true私は同じ動作を取得:醜いサーバーが生成したエラーページが表示されます。false何も設定されていない場合-空白のブラウザウィンドウ。
Shawn South

私のためにうまくいきました!Pavel Chuchuvaが彼の回答で述べている設定も機能しましたが、他の問題を引き起こすいくつかの副作用がありました。この設定により、必要な特定のシナリオでIISエラーのオーバーライドをスキップし、他のすべての動作はそのままにします。
Kevin Tighe、2015年

Azureでうまく機能しました。サーバーヘッダーServer:Microsoft-IIS/8.5 X-AspNet-Version:4.0.30319 X-AspNetMvc-Version:5.2 X-Powered-By:ASP.NET
oxfn

customErrors mode="Off"これを機能させるには、まだ設定する必要があると思います。その場合、この回答のコードを使用すると、httpErrors existingResponse = "Auto"(デフォルト)が適切に機能します。
AaronLS

11

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


1
これは答えとしてマークされていましたが、他の返信を読んでこのトピックについての洞察を深めるのはしばらく価値があると思います。
Lex Li

また、削除することをお勧めします。FilterConfigのHandleErrorAttribute
Gごと

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ステータスコードが返されたくありません

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


3

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

  • .NET Framework 4
  • MVC 3
  • IIS8(ワークステーション)およびIIS7(Webサーバー)

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

まず、私のコードはをスローする必要がありましたHttpExceptionNotFoundResultコントローラからa を返すと、私が求めていた結果が得られませんでした。

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

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

<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>

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

customErrors設定は、私が明示的にスロー処理するために必要であるように思われHttpExceptionている間、httpErrorsノードはGlobals.asax.csに指定されたルートパターンの外に落ちたURLを取り扱います。

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


2

TrySkipIisCustomErrorsパズルの一部にすぎません。カスタムエラーページを使用していて、4xxステータスに基づいてRESTfulコンテンツを配信したい場合は、問題があります。.netは常に一部のページコンテンツをIISに配信するように見えるため、web.configのhttpErrors.existingResponseを "Auto"に設定しても機能しません。したがって、 "Auto"を使用すると、すべて(または少なくとも一部)のカスタムエラーページが使用されなくなります。応答にはhttpステータスコードが含まれるため、「置換」を使用しても機能しませんが、その内容は空であるか、カスタムエラーページで埋められます。また、「PassThrough」は実際にはCEPをオフにするため、使用できません。

したがって、いくつかのケースでCEPをバイパスする場合(バイパスすることで、ステータス4xxをコンテンツとともに返すことを意味します)、追加の手順が必要になります。エラーを消去します。

void Application_Error(object sender, EventArgs e)
{
    var httpException = Context.Server.GetLastError() as HttpException;
    var statusCode = httpException != null ? httpException.GetHttpCode() : (int)HttpStatusCode.InternalServerError;

    Context.Server.ClearError();
    Context.Response.StatusCode = statusCode;
}

したがって、REST応答(つまり、400-Bad Request)を使用してコンテンツを送信する場合はTrySkipIisCustomErrors、アクションのどこかに設定existingResponseし、web.configのhttpErrorsセクションで "Auto"に設定する必要があります。今:

  • エラーがなく(アクションが4xxまたは5xxを返す)、一部のコンテンツが返される場合、CEPは使用されず、コンテンツはクライアントに渡されます。
  • エラーが発生すると(例外がスローされます)、エラーハンドラーから返されたコンテンツが削除されるため、CEPが使用されます。

アクションから空のコンテンツを含むステータスを返したい場合は、空の応答として扱われ、CEPが表示されるため、このコードを改善する余地があります。


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

詳細な調査の結果、間違った方法があったことが判明しました。詳細なメッセージはデフォルトではありませんが、言及したさまざまなエラーメッセージが表示されている場合は、ボックスでオンになっている可能性があります。


Response.StatusCodeは整数であるため、単なる「404」以外の具体的なコードを設定する方法はわかりません。URLが示すように、カスタムエラーページを使用/表示するようにIIS7を構成しました。
ニコラス

うーん...ホームPCを使用していないため、残念ながら現時点ではテストできません。それまでに解決策がない場合-私は今夜見ます。
nullnvoid 2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.