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[]作为示例二进制数据。

WebClient openWrite在关闭之前不写

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。