HttpWebRequest和Transfer-Encoding

时间:2009-06-26 10:00:49

标签: c# http chunked-encoding

HttpWebRequest用于通过基本身份验证从ASP.NET站点下载文件。在许多情况下,一切正常,但是如果使用HttpWebRequest.GetResponse()状态代码的答案被分块,则某些代理会将答案分块并且401会引发异常。例外是:

    System.Net.WebException: The server committed a protocol violation.  
    Section=ResponseStatusLine
    at System.Net.HttpWebRequest.GetResponse()
Trace of answer is:<pre>
"HTTP/1.1 401 Authorization Required\r\nDate: Fri, 26 Jun 2009 04:45:18 GMT\r\nServer: Microsoft-IIS/6.0\r\nX-Powered-By: ASP.NET\r\nX-AspNet-Version: 2.0.50727\r\nWWW-Authenticate: Basic realm=\"iis-server\"\r\nCache-Control: private\r\nContent-Type: text/html; charset=iso-8859-1\r\nVia: 1.1 server\r\nKeep-Alive: timeout=15, max=100\r\nConnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\nContent-Language: en\r\n\r\n0\r\n\r\n0\r\n\r\n

我做了测试,发现Transfer-Encoding: chunked是异常的唯一原因。这是.NET Framework 2.0的错误还是有任何RFC说401答案不应该被分块?

1 个答案:

答案 0 :(得分:1)

我实际上认为错误不是不允许Chunked Transfer Encoding(CTE),我认为服务器正在错误地进行CTE。如果您查看响应正文,它看起来像这样:

Language: en \r\n
\r\n
0 \r\n
\r\n
0 \r\n
\r\n

如果您注意到,响应正文中有两个0长度的块。 CTE RFC要求消息的最后一个块是0长度的块,并且,通过扩展,没有先前的块可以是零长度。在此消息中,您有0个零长度块,这是违反CTE的协议。

这类似于为消息设置内容长度标头,然后传输的数据超过该内容长度标头所允许的数据。