2009-06-26 15 views
0

HttpWebRequest wird zum Herunterladen von Dateien von ASP.NET-Site mit Standardauthentifizierung verwendet. Alles funktioniert in vielen Fällen gut, aber einige Proxies machen die Antwort chunked und löst eine Ausnahme aus, wenn die Antwort mit 401 Statuscode chunked ist. Die Ausnahme ist:HttpWebRequest und Transfer-Encoding

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 

ich gemacht Test und fand heraus, dass Transfer-Encoding: chunked ist der einzige Grund für die Ausnahme. Ist dieser Fehler von .NET Framework 2.0 oder gibt es RFC besagt, dass 401 Antwort nicht chunked werden sollte?

+0

Tritt dieses Problem bei bestimmten Proxies oder bestimmten Dateien auf? –

Antwort

1

Ich glaube eigentlich, der Fehler ist nicht, dass Chunked Transfer Encoding (CTE) nicht erlaubt ist, ich denke es ist, dass der Server das CTE falsch macht. Wenn man sich die Antwort Körper aussehen, ist es wie folgt aussehen:

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

Wenn Sie bemerken, gibt es zwei 0 Länge Brocken im Antworttext. Der CTE-RFC erfordert, dass der letzte Chunk einer Nachricht ein Chunk mit der Länge 0 ist und dass kein vorheriger Chunk von der Länge Null sein kann. In dieser Nachricht haben Sie 0 Zero-Length-Chunks, was eine Protokollverletzung von CTE darstellt.

Dies entspricht dem Festlegen eines Inhaltslängenheaders für eine Nachricht und dem anschließenden Übertragen von mehr Daten als von diesem Inhaltslängenheader zulässig.