14

私は ASP.NET MVC を使用して REST API を実装していExpect: 100-continueますが、投稿本文を含む要求の要求ヘッダーの形で小さな障害が発生しました。

RFC 2616は次のように述べています。

「100-continue」期待値を持つ Expect リクエスト ヘッダー フィールドを含むリクエストを受信すると、オリジン サーバーは 100 (Continue) ステータスで応答して入力ストリームからの読み取りを続行するか、最終ステータス コードで応答する必要があります。オリジン サーバーは、100 (Continue) 応答を送信する前に、要求本文を待機してはなりません。最終ステータス コードで応答する場合、トランスポート接続を閉じるか、残りの要求を読み込んで破棄し続けることができます。最終ステータス コードを返す場合、要求されたメソッドを実行してはなりません。

これは、リクエストに対して2 つの応答を行う必要があるように思えます。つまり、すぐに HTTP 100 Continue 応答を送信してから、HttpContext.Request.InputStream要求を終了せずに元の要求ストリーム (つまり ) から読み取りを続行し、最後に結果を送信する必要があります。ステータス コード (議論のために、それが 204 No Content の結果であるとしましょう)。

したがって、質問は次のとおりです。

  1. 要求に対して 2 つの応答を行う必要があるという仕様を正しく読んでいますか?
  2. ASP.NET MVC でこれを行うにはどうすればよいですか?

wrt (2) 入力ストリームの読み取りに進む前に、次のコードを使用してみました...

HttpContext.Response.StatusCode = 100;
HttpContext.Response.Flush();
HttpContext.Response.Clear();

...しかし、最終的な 204 ステータス コードを設定しようとすると、エラーが発生します。

System.Web.HttpException: HTTP ヘッダーが送信された後、サーバーは状態を設定できません。

4

3 に答える 3

17

デフォルトでは、.NET フレームワークは常にexpect: 100-continueすべての HTTP 1.1 ポストのヘッダーを送信します。System.Net.ServicePoint.Expect100Continueこの動作は、次のようにプロパティを介してリクエストごとにプログラムで制御できます。

HttpWebRequest httpReq = GetHttpWebRequestForPost();
httpReq.ServicePoint.Expect100Continue = false;

プログラムでグローバルに制御することもできます。

System.Net.ServicePointManager.Expect100Continue = false;

...または構成を通じてグローバルに:

<system.net>
  <settings>
    <servicePointManager expect100Continue="false"/>
  </settings>
</system.net>

この情報を提供してくれた Lance Olson とPhil Haackに感謝します。

于 2009-06-23T21:20:29.807 に答える
2

IIS は 100 を処理します。

そうは言っても、いいえ、それは2つの応答ではありません。HTTP では、Expect: 100-continue がメッセージ ヘッダーの一部として入ってくると、クライアントはコンテンツを送信する前に応答を受信するまで待機する必要があります。

asp.net の設計方法により、出力ストリームをほとんど制御できません。ストリームに書き込まれるデータは、バッファ モードであるかどうかに関係なく、フラッシュするたびに、チャンク エンコーディングを使用して自動的に 200 応答に入れられます。

悲しいことに、このようなことはすべて内部メソッドのいたるところに隠されているため、MVC と同様に asp.net に依存している場合、それをバイパスすることはほとんどできません。

バッファリングされていない方法で入力ストリームにアクセスしようとするまで待ちます。痛みの全負荷。

セブ

于 2009-06-12T00:57:15.993 に答える
2

100-continue は IIS で処理する必要があります。これを明示的に行いたい理由はありますか?

于 2009-05-18T21:12:10.973 に答える