我正在从WinForms应用程序发送一个HTTP PUT请求,我想向PUT数据发送缓慢的涓流数据,当PUT数据到达时,该页面会将消息写入数据库。我正在使用WebRequest并将SendChunked设置为true,但只有在将8KB数据写入请求流后才会发送一个块。
更糟糕的是,网页似乎在大约42KB之后停止接收,并且发送者在大约77KB之后抛出WebException并显示消息“请求被中止:请求被取消。”
我实际上是在每条消息中发送了非常少量的数据,所以如果我可以说服WebRequest发送一个包含每条消息的小块,我就没事了。
到目前为止,这是我正在尝试的内容:
var request =
(HttpWebRequest)WebRequest.Create("http://localhost/test.php");
request.Method = "PUT";
request.Timeout = 300 * 1000;
request.SendChunked = true;
request.AllowWriteStreamBuffering = false;
request.ContentType = "application/octet-stream";
using (var post = new StreamWriter(request.GetRequestStream()))
{
post.AutoFlush = true;
for (int i = 0; i < 100; i++)
{
if (i > 0)
{
// force flushing previous chunk
post.Write(new String(' ', 1048));
Thread.Sleep(2 * 1000);
}
Console.Out.WriteLine("Requesting {0} at {1}.", i, DateTime.Now);
string chunk = i.ToString();
post.WriteLine(i);
}
}
我在每条消息之后写了1KB的空白,试图强制WebRequest更快地发送一个块。
答案 0 :(得分:1)
如果没有人有更优雅的建议,我想我可以打开一个原始套接字并自己实现分块编码。在this answer中有一个合理的描述。
答案 1 :(得分:1)
如果我正确理解您的问题,您想发出一个PUT请求。作为请求的一部分,您希望发送分块数据,并且您希望服务器对它看到的每个块采取操作。
我不认为使用HttpWebRequest可以很容易地实现这一点。正如您所注意到的那样,虽然HWR将发送分块数据,但它并不能让您控制块的开始和结束位置。
接下来,即使您可以通过编写像Don建议的自定义Socket实现来启动客户端,您仍然无法保证Web服务器会为您收到的每个块控制您的应用程序。网络服务器可能决定缓冲几个块并同时将它们全部交给应用程序。
我建议你重新考虑你的设计,并有一个简单的基于请求/响应的模型,其中请求+数据构成了服务器需要采取的行动。