2015-07-11 96 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或指定内容长度(我没有手头有现在)异常。