WebClient openWrite not writing until it is closed
I'm using a WebClient to send raw bytes to a web server. The web server knows what to do with those raw bytes. However the WebClient doesn't actually send the data to the server until the call to w.Close() on the last line. I would like to send t开发者_JAVA百科he data every time w.Flush() is called. Is that possible?
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.s I'm not interested in UploadFile. I'm just using the file's byte[] as sample binary data.
The default behavior of HttpWebClient is to buffer all the data, determine its length and use that to set the Content-Length in HTTP request headers.
For most people, the correct answer nowadays is to use HttpClient which was introduced in .NET framework 4.5.
For those of us still using .NET framework v3.5, here are two alternatives:
- Set the
Content-Lengthbefore opening the request stream. This cannot be done directly throughWebClient, and we need to create theHttpWebRequestobject manually. This code sends data byte-per-byte as an example:
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();
- Set
SendChunkedtotrueinHttpWebRequestto use the chunked transfer encoding. Be aware that it has some bugs which affect thebufferOffsetargument to streamWrite()method.
加载中,请稍侯......
精彩评论