18

POST次のコードを使用してリクエストを行うと:

string body = "Hello World";
byte[] bytes = Encoding.ASCII.GetBytes(body);
WebRequest request = WebRequest.Create("http://internalurl");
request.Method = "POST";
request.ContentLength = bytes.Length;

POSTコンテンツの長さをedのバイト数に設定します。リクエストの正しいものはContentLengthどれですか?GET

4

1 に答える 1

32

GET通常、リクエストを実行するときに追加のデータを送信しないため、ヘッダーContent-Lengthはまったく送信されません。

ヘッダーはmessage-bodyContent-Lengthを送信する場合にのみ含める必要があり、問題のヘッダーの値は常にこのフィールドの長さであり、( OCTETs ) バイト単位で測定されます。

(RFC2616) 14.13 コンテンツの長さ

Content-Length エンティティ ヘッダー フィールドは、受信者に送信されたエンティティ ボディのサイズを OCTET の 10 進数で示します。HEAD メソッドの場合は、送信されたエンティティ ボディのサイズが示されます。リクエストはGETでした。

<中略/>

アプリケーションは、セクション4.4のルールで禁止されていない限り、このフィールドを使用してメッセージ本文の転送長を示す必要があります。


リクエストを行うときにmessage-bodyを含めることは(私の知る限り)悪い習慣と考えられていますGETが、HTTP RFC2616を読むと、リクエストにmessage-body をGET含めることができないという記述はありません。

今日のほとんどのWebサーバーは、メッセージ本文でデータを送信し、その場合に解析および処理されることを期待している場合、返信してほしい内容で返信しないと思います.

(RFC2616) 4.3 メッセージ本文

HTTP メッセージのメッセージ本体 (存在する場合) は、要求または応答に関連付けられたエンティティ本体を運ぶために使用されます。メッセージ本文は、Transfer-Encoding ヘッダー フィールド (セクション 14.41) で示されるように、転送コーディングが適用された場合にのみエンティティ本体と異なります。

   message-body = entity-body
                | <entity-body encoded as per Transfer-Encoding>

メッセージの安全で適切な転送を保証するために、アプリケーションによって適用される転送コーディングを示すために、転送エンコーディングを使用する必要があります。Transfer-Encoding は、エンティティではなくメッセージのプロパティであるため、要求/応答チェーンに沿ってアプリケーションによって追加または削除される場合があります。(ただし、セクション 3.6 では、特定の転送コーディングをいつ使用できるかについて制限を設けています。)

メッセージでメッセージ本文が許可される場合の規則は、要求と応答で異なります。

要求にメッセージ本文が存在することは、要求のメッセージ ヘッダーに Content-Length または Transfer-Encoding ヘッダー フィールドを含めることによって通知されます。

リクエスト メソッドの仕様 (セクション 5.1.1) でエンティティ ボディの送信が許可されていない場合、リクエストにメッセージ ボディを含めてはなりません (MUST NOT)。

サーバーは、任意の要求でメッセージ本文を読み取って転送する必要があります。リクエストメソッドにエンティティボディの定義されたセマンティクスが含まれていない場合、リクエストを処理するときにメッセージボディを無視する必要があります。

于 2011-12-16T22:36:47.873 に答える