HTTP上传进度
HTTP upload progress
我正在将一些表单数据(包括文件)上传到网络服务器,并且需要跟踪上传进度。我通过将我的上传数据一点一点地复制到HttpWebRequest
的请求流中,并根据复制的字节数和总字节数更新进度条。根据另一个网站的说法,这将缓冲所有内容,之后实际的网络传输需要更长的时间。我应该设置 request.AllowWriteStreamBuffering = false;
来防止缓冲。不幸的是,当我这样做时,request.GetResponse()
方法会永远阻塞。
下面是一些示例代码:
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
时一切正常。这里有什么问题?
问题是设置 AllowWriteStreamBuffering
太晚了。这很好用:
HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(uri);
request.AllowWriteStreamBuffering = false;
request.SendChunked = true;
request.AllowAutoRedirect = false;
request.Method = "POST";
...
通过预先设置AllowWriteStreamBuffering
,它还异常告诉我必须设置SendChunked
或指定内容长度(我现在手头没有)。
我正在将一些表单数据(包括文件)上传到网络服务器,并且需要跟踪上传进度。我通过将我的上传数据一点一点地复制到HttpWebRequest
的请求流中,并根据复制的字节数和总字节数更新进度条。根据另一个网站的说法,这将缓冲所有内容,之后实际的网络传输需要更长的时间。我应该设置 request.AllowWriteStreamBuffering = false;
来防止缓冲。不幸的是,当我这样做时,request.GetResponse()
方法会永远阻塞。
下面是一些示例代码:
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
时一切正常。这里有什么问题?
问题是设置 AllowWriteStreamBuffering
太晚了。这很好用:
HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(uri);
request.AllowWriteStreamBuffering = false;
request.SendChunked = true;
request.AllowAutoRedirect = false;
request.Method = "POST";
...
通过预先设置AllowWriteStreamBuffering
,它还异常告诉我必须设置SendChunked
或指定内容长度(我现在手头没有)。