WebClient openWrite在关闭之前不写
本文关键字:openWrite WebClient | 更新日期: 2023-09-27 18:08:35
我正在使用WebClient向web服务器发送原始字节。web服务器知道如何处理这些原始字节。然而,WebClient直到最后一行调用了w.c close()之后才真正将数据发送到服务器。我想在每次调用w.r ush()时发送数据。这可能吗?
string filename = "C:''blah.dat";
byte[] content = File.ReadAllBytes(filename);
WebClient wc = new WebClient();
Stream w = wc.OpenWrite("http://localhost:80/files/");
for (int i = 1; i < 10; i++)
{
w.Write(content, 0, content.Length);
w.Flush();
}
w.Close();
p。我对UploadFile不感兴趣。我只是使用文件的byte[]作为示例二进制数据。
HttpWebClient
的默认行为是缓冲所有数据,确定其长度并使用它来设置HTTP请求头中的Content-Length
。
对于大多数人来说,现在正确的答案是使用。net framework 4.5中引入的HttpClient。
对于那些还在使用。net框架v3.5的人,这里有两个选择:
- 打开请求流前设置
Content-Length
。这不能直接通过WebClient
完成,我们需要手动创建HttpWebRequest
对象。以下代码以字节为单位发送数据:
byte[] data = ...;
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://example.com");
req.Method = "POST";
req.ContentType = "text/plain";
req.ContentLength = data.Length;
Stream stream = req.GetRequestStream();
for (int i = 0; i < data.Length; i++)
{
stream.Write(data, i, 1);
stream.Flush()
Thread.Sleep(100);
}
stream.Close();
- 将
HttpWebRequest
中的SendChunked
设置为true
,使用分块传输编码。注意,它有一些影响bufferOffset
参数流Write()
方法的bug。