2009-05-18 13 views
10

ASP.NET MVCを使用してREST APIを実装していますが、少しの不具合がリクエストヘッダーのExpect: 100-continueという形で表示されています郵便体。ASP.NET MVCで「Expect:100-continue」ヘッダーをサポート

Upon receiving a request which includes an Expect request-header field with the "100-continue" expectation, an origin server MUST either respond with 100 (Continue) status and continue to read from the input stream, or respond with a final status code. The origin server MUST NOT wait for the request body before sending the 100 (Continue) response. If it responds with a final status code, it MAY close the transport connection or it MAY continue to read and discard the rest of the request. It MUST NOT perform the requested method if it returns a final status code.

これは、私はすなわち、それはすぐにHTTP 100応答を続行送信する必要がある、要求に応答を行う必要があり、その後から読み続けるように私に聞こえる:

RFC 2616状態という(つまりHttpContext.Request.InputStream)、最後に結果のステータスコードを送信します(引数として、No Contentの結果が204となります)。

ので、ご質問は以下のとおりです。

  1. は私が要求に2つの応答をする必要があることを、私は仕様の権利を読んでいますか?
  2. これはASP.NET MVCでどのように行うことができますか?

w.r.t. (2)私は...、入力ストリームを読み取るために進む前に、次のコードを使用して

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

を試してみました...しかし、私は最終的に204のステータスコードを設定しようとすると、私はエラーを取得する:

System.Web.HttpException: Server cannot set status after HTTP headers have been sent.

答えて

2

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

+0

いいえ - 私はそれを避けたいです!私は、IISが何の介入もせずにそれを処理することを認識しませんでした。 –

+0

100 Continueで 'WebRequest'にバグがありました。それを使わないのが良い理由です。 http://regis.decamps.info/blog/2010/12/c-bug-in-webrequest/ – rds

2

IISはありません、それは2つの応答はない、と述べた100

を処理します。 HTTPでは、メッセージヘッダーの一部としてExpect:100-Continueが入力されると、クライアントはコンテンツを送信する前に応答を受信するまで待機する必要があります。

asp.netが設計されているため、出力ストリームをほとんど制御できません。ストリームに書き込まれるすべてのデータは、バッファリングされたモードであるかどうかにかかわらず、フラッシュするたびにチャンクエンコードされた200応答に自動的に格納されます。

悲しいことに、これらのものはすべて内部的な方法で隠されています。その結果、asp.netに頼ると、MVCと同じように、バイパスできなくなります。

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

セブ

15

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

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

また、グローバルプログラムで制御することができます。

...またはグローバルコンフィギュレーションを通じて:

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

が、この情報のためのあなたのランス・オルソンとPhil Haackありがとうございます。

+0

どこにSystem.Net.ServicePointManager.Expect100Continue = falseを追加する必要がありますか?私のwp7コードで? – Apoorva

+1

私はWP7のプログラミングをしていませんが、コードがApp.xaml.csに入っていて、Application_LaunchingまたはApplication_Activatedイベントハンドラに入っていると思います。 –

+0

これは全く質問に答えません... –

関連する問題