0

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 の回答をチャンクにすべきではないと書かれていますか?

4

1 に答える 1

1

実際、エラーは Chunked Transfer Encoding (CTE) が許可されていないということではなく、サーバーが CTE を正しく実行していないことが原因だと思います。応答本文を見ると、次のようになっています。

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

お気づきのように、応答本文には長さが 0 のチャンクが 2 つあります。CTE RFC では、メッセージの最後のチャンクは長さ 0 のチャンクである必要があり、拡張により、前のチャンクの長さを 0 にすることはできません。このメッセージでは、CTE のプロトコル違反である長さゼロのチャンクが 0 個あります。

これは、メッセージのコンテンツ長ヘッダーを設定し、そのコンテンツ長ヘッダーで許可されているよりも多くのデータを送信することに似ています。

于 2012-03-27T19:43:57.670 に答える