为GET请求设置的正确Content-Length是什么?

时间:2011-12-16 22:34:48

标签: http http-headers httpwebrequest content-length

当我使用以下代码发出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是什么?

1 个答案:

答案 0 :(得分:25)

由于您在执行GET请求时通常不会发送任何其他数据,因此根本不应发送标头Content-Length

只有在您发送 message-body 时才应包含标题Content-Length,并且相关标题的值始终是此字段的长度,以(< em> OCTET )字节。

  

(RFC2616) 14.13 Content-Length

     

Content-Length entity-header字段指示实体主体的大小,以十进制数量的OCTET发送给接收者,或者在HEAD方法的情况下,指示实体主体的大小。如果请求是GET,则已发送。

     

&lt; snip /&gt;

     

应用程序应该使用此字段来指示消息正文的传输长度,除非4.4部分中的规则禁止这样做。


在执行GET请求时,(AFAIK)认为包含 message-body 的做法不好,但在阅读HTTP RFC2616时,我没有看到任何声明(RFC2616) 4.3 Message Body {1}}请求不能包含 message-body

虽然如果您在 message-body 中发送数据并且希望在这种情况下解析和处理数据,我将假设今天的大多数Web服务器都不会回复您希望他们回复的内容。

  

{{3}}

     

HTTP消息的消息体(如果有的话)用于携带   与请求或响应关联的实体主体。消息体   只有在传输编码时才与实体体不同   应用,如Transfer-Encoding标头字段所示(部分   14.41)。

GET
     

传输编码必须用于指示任何传输编码   应用程序申请确保安全和正确的转移   信息。 Transfer-Encoding是消息的属性,而不是实体的属性,因此可以由任何应用程序添加或删除   请求/响应链。 (但是,第3.6节规定了限制   当可以使用某些转移编码时。)

     

邮件中允许邮件正文的规则有所不同   请求和回复。

     

请求中存在消息正文   包含Content-Length或Transfer-Encoding标头字段   请求的消息标题。

     

如果请求方法的规范(第5.1.1节)不允许在请求中发送实体主体,则消息体不得包含在请求中。

     

服务器应该在任何请求中读取和转发消息体;如果是请求方法   不包含实体主体的定义语义,然后是   处理请求时,应该忽略message-body。