HttpWebRequest推迟写请求

时间:2013-11-05 23:58:00

标签: c# http upload httpwebrequest webresponse

我想跟踪上传请求的状态,例如:

  • 上传数据包
  • 使用进度更新用户界面
  • 上传数据包
  • 使用进度更新用户界面
  • 上传数据包
  • 使用进度更新用户界面
  • 等等

所以我尝试了下面的代码(从网上找到的例子中收集)。

void SendData()
{
    byte[] bytes = Encoding.UTF8.GetBytes(GetContent());
    HttpWebRequest webRequest = WebRequest.Create(GetURL()) as HttpWebRequest;
    webRequest.Method = "PUT";
    webRequest.ContentType = @"application/x-www-form-urlencoded";
    webRequest.ContentLength = bytes.Length;

    // this doesn't seem to help
    webRequest.AllowWriteStreamBuffering = false;

    using (Stream reqStream = webRequest.GetRequestStream())
    {
        int bytesUploaded = 0;
        while (bytesUploaded != bytes.Length)
        {
            int packetSize = Math.Min(PACKETSIZE, bytes.Length - bytesUploaded);
            reqStream.Write(bytes /*buffer*/, 
                            bytesUploaded /*Offset*/, 
                            packetSize /*Count*/);

            // this doesn't seem to help
            reqStream.Flush();

            bytesUploaded += packetSize;
            UI.SetProgress(bytesUploaded / bytes.Length, 
                           true /*Dispatch?*/);
        }
    }

    WebResponse webResponse = webRequest.GetResponse(); //stalls here while it uploads
}

但它没有按预期工作。它不是在刷新之后上传字节,而是在while循环的多次迭代中运行,然后在GetResponse()阶段上传。我知道它不是在while循环中上传的,因为无论我设置字节数组有多大,循环所需的时间几乎没有变化;然而,GetResponse()阶段的时间成比例增加。

导致进度从0-100%眨眼间开始,然后在实际发送数据所需的时间内保持100%。

1 个答案:

答案 0 :(得分:0)

首先,我找不到你的PACKETSIZE的定义。您是否进行了调试并确保bytes长于数据包大小常量?

其次,我怀疑你是否正确使用了这个循环。 当您上传时,您的GetRequestStream会在最后更新,并尝试在中途刷新它似乎不正确。 (有关详细信息,请查看this答案)。

试试这个:将阵列分成10块。从0-9运行一个循环,并在每个循环中发送相应的数组位,等待响应,刷新/关闭流,然后调用UI.SetProgress。冲洗并重复。