1

我正在从 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 更快地发送一个块。

4

2 回答 2

1

如果没有人有任何更优雅的建议,我想我可以打开一个原始套接字并自己实现分块编码。这个答案中有一个合理的描述。

于 2010-10-15T23:24:33.827 回答
1

如果我正确理解您的问题,您想发出一个 PUT 请求。作为请求的一部分,您希望发送分块数据,并且您希望服务器对它看到的每个块执行操作。

我认为使用 HttpWebRequest 不会很容易做到这一点。正如您所注意到的,虽然 HWR 将发送分块数据,但它不能让您控制块的确切开始和结束位置。

接下来,即使您可以关闭客户端,通过按照 Don 的建议编写自定义 Socket 实现,您仍然不能保证 Web 服务器将控制您的应用程序接收到的每个块。网络服务器可能决定缓冲几个块并同时将它们全部提供给应用程序。

我建议你重新考虑你的设计,并有一个简单的基于请求/响应的模型,其中请求+数据构成服务器需要采取的行动。

于 2010-10-16T19:25:45.373 回答