2015-07-11 95 views
0

我正在將一些表單數據(包括文件)上傳到Web服務器,並需要跟蹤上傳進度。我通過將我的上傳數據逐位複製到HttpWebRequest的請求流並根據複製的字節數和字節總數更新進度欄來完成。根據另一個網站,這將緩衝一切,而實際的網絡傳輸需要更長的時間。我應該設置request.AllowWriteStreamBuffering = false;以防止緩衝。 Unfortunatley,當我這樣做時,request.GetResponse()方法永遠阻止。HTTP上傳進度

下面是一些示例代碼:

HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(uri); 
request.AllowAutoRedirect = false; 
request.Method = "POST"; 
request.ContentType = "multipart/form-data; boundary=" + multipartBoundary; 
Stream reqStream = request.GetRequestStream(); 
request.AllowWriteStreamBuffering = false; 
postStream.Seek(0, SeekOrigin.Begin); 
byte[] buffer = new byte[4096]; 
int bytesRead; 
while ((bytesRead = postStream.Read(buffer, 0, buffer.Length)) > 0) 
{ 
    reqStream.Write(buffer, 0, bytesRead); 
    int percentage = (int) (postStream.Position * 100/postStream.Length); 
    backgroundWorker.ReportProgress(percentage); 
} 
reqStream.Close(); 
HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 

當我不設置AllowWriteStreamBuffering這一切工作正常。這裏有什麼問題?

回答

0

問題在於太晚設置AllowWriteStreamBuffering。這工作得很好:

HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(uri); 
request.AllowWriteStreamBuffering = false; 
request.SendChunked = true; 
request.AllowAutoRedirect = false; 
request.Method = "POST"; 
... 

通過事先設定AllowWriteStreamBuffering,還告訴我,我必須設置SendChunked或指定內容長度(我沒有手頭有現在)異常。