WinForms アプリケーションから HTTP PUT 要求を送信しています。PUT データが到着すると、メッセージをデータベースに書き込むページに PUT データをゆっくりと送信したいと考えています。私は WebRequest を使用していて、SendChunked を true に設定しましたが、8KB のデータが要求ストリームに書き込まれた後にのみチャンクを送信するようです。
さらに悪いことに、Web ページは約 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);
}
}
各メッセージの後に 1 KB の空白を書き込んで、WebRequest がより早くチャンクを送信するように強制します。