代码之家  ›  专栏  ›  技术社区  ›  Don Kirkby

我可以告诉WebRequest何时从请求流发送块吗?

  •  1
  • Don Kirkby  · 技术社区  · 14 年前

    我正在从一个WinForms应用程序发送一个HTTP Put请求,我想向页面发送一个缓慢的Put数据流,该页面将在Put数据到达时将消息写入数据库。我正在使用webrequest,我已经将sendbchunked设置为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更快地发送一个块。

    2 回复  |  直到 7 年前
        1
  •  1
  •   feroze    14 年前

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

    我认为使用httpwebrequest很难做到这一点。正如您所注意到的,虽然hwr将发送分块数据,但它并不能让您控制分块的开始和结束位置。

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

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

        2
  •  1
  •   Community CDub    8 年前

    如果没有人有更优雅的建议,我想我可以打开一个原始的套接字,自己实现分块编码。有一个合理的描述 this answer .