Я отправляю запрос HTTP PUT из приложения WinForms, и я хотел бы отправить медленный поток данных PUT на страницу, которая будет записывать сообщения в базу данных по мере поступления данных PUT. Я использую WebRequest и установил для SendChunked значение true, но кажется, что отправка фрагмента происходит только после записи 8 КБ данных в поток запросов.
Хуже того, кажется, что веб-страница перестает получать примерно через 42 КБ, а отправитель выдает WebException примерно через 77 КБ с сообщением «Запрос был прерван: запрос был отменен».
На самом деле я отправляю очень малые объемы данных в каждом сообщении, поэтому, если бы я мог убедить 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 КБ пробела после каждого сообщения, чтобы попытаться заставить WebRequest отправить чанк быстрее.