如何通过HttpWebRequest分段上传数据
How to upload data by portions via HttpWebRequest
问题:
我想通过单个 http 请求分块上传数据,并在每次上传后显示进度变化(通过 Internet 物理发送数据)。 (现在不重要我应该如何显示上传进度,我可以简单地输出一些数据到控制台)。
代码:
Stackoverlow 有很多这样的问题:
link 1,等等(我不能包含更多链接,因为我没有足够的声誉)。
using System;
using System.Text;
using System.IO;
using System.Net;
...
public static void UploadData()
{
const string data = "simple string";
byte[] buffer = new ASCIIEncoding().GetBytes(data);
// Thanks to http://www.posttestserver.com all is working from the box
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://posttestserver.com/post.php");
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 " +
"(KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10";
req.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
req.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
req.Headers.Add("Accept-Language", "en-US,en;q=0.8");
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = buffer.Length;
req.SendChunked = true;
int bytesRead = buffer.Length;
const int chunkSize = 3;
Stream s = req.GetRequestStream();
for (int offset = 0; offset < bytesRead; offset += chunkSize)
{
int bytesLeft = bytesRead - offset;
int bytesWrite = bytesLeft > chunkSize ? chunkSize : bytesLeft;
s.Write(buffer, offset, bytesWrite);
}
s.Close(); // IMPORTANT: only here all data will be send
}
备注:
同样根据
this link,
每次发送都必须在每次写入请求流期间发生,但实际上(可以在 Fiddler 中演示)所有发送操作仅在请求流关闭后或仅通过响应获取而不是更早发生。 (一切都取决于 SendChuncked
、AllowWriteStreamBuffering
和 ContentLength
参数,但 每次写入流后都不会发送数据 )。
问题:
如何在每次写入(每次调用 Write 方法)后(物理上)发送数据?
约束:
网络 2.0;
仅使用 HttpWebRequest 原语(而非 WebClient)。
因为没有人回答这个问题,但是 zergatul user, I shall post this answer from russian Whosebug 这里已经在 russian Whosebug 上回答了这个问题。
答案
它按您的预期工作。我使用了 Microsoft 网络监视器。这是一个很好的实用程序,它是免费的(与 httpdebugger 相比)。我在 Net 2.0 中调试了你的代码。
Network Monitor 显示每次发送 3 个字节(我取了更长的字符串)。
此处文本 "ple" ("simple string") 已发送。
备注
在第一张图片中,字符串
// ВАЖНО: только здесь будут отправлены данные через сеть
意思是
// IMPORTANT: only here data will be sent over the net
问题:
我想通过单个 http 请求分块上传数据,并在每次上传后显示进度变化(通过 Internet 物理发送数据)。 (现在不重要我应该如何显示上传进度,我可以简单地输出一些数据到控制台)。
代码:
Stackoverlow 有很多这样的问题: link 1,等等(我不能包含更多链接,因为我没有足够的声誉)。
using System;
using System.Text;
using System.IO;
using System.Net;
...
public static void UploadData()
{
const string data = "simple string";
byte[] buffer = new ASCIIEncoding().GetBytes(data);
// Thanks to http://www.posttestserver.com all is working from the box
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://posttestserver.com/post.php");
req.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 " +
"(KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10";
req.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
req.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
req.Headers.Add("Accept-Language", "en-US,en;q=0.8");
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = buffer.Length;
req.SendChunked = true;
int bytesRead = buffer.Length;
const int chunkSize = 3;
Stream s = req.GetRequestStream();
for (int offset = 0; offset < bytesRead; offset += chunkSize)
{
int bytesLeft = bytesRead - offset;
int bytesWrite = bytesLeft > chunkSize ? chunkSize : bytesLeft;
s.Write(buffer, offset, bytesWrite);
}
s.Close(); // IMPORTANT: only here all data will be send
}
备注:
同样根据
this link,
每次发送都必须在每次写入请求流期间发生,但实际上(可以在 Fiddler 中演示)所有发送操作仅在请求流关闭后或仅通过响应获取而不是更早发生。 (一切都取决于 SendChuncked
、AllowWriteStreamBuffering
和 ContentLength
参数,但 每次写入流后都不会发送数据 )。
问题:
如何在每次写入(每次调用 Write 方法)后(物理上)发送数据?
约束:
网络 2.0;
仅使用 HttpWebRequest 原语(而非 WebClient)。
因为没有人回答这个问题,但是 zergatul user, I shall post this answer from russian Whosebug 这里已经在 russian Whosebug 上回答了这个问题。
答案
它按您的预期工作。我使用了 Microsoft 网络监视器。这是一个很好的实用程序,它是免费的(与 httpdebugger 相比)。我在 Net 2.0 中调试了你的代码。
Network Monitor 显示每次发送 3 个字节(我取了更长的字符串)。
此处文本 "ple" ("simple string") 已发送。
备注
在第一张图片中,字符串
// ВАЖНО: только здесь будут отправлены данные через сеть
意思是
// IMPORTANT: only here data will be sent over the net