即使AllowWriteStreamBuffering为false,HttpWebRequest也会进行缓存

时间:2013-07-17 16:58:34

标签: c# .net ios xamarin.ios mono

我正在尝试在iOS应用程序上实现上传进度条。我目前的实现做了这个简单的技巧:

using (Stream requestStream = request.GetRequestStream ()) {
    byte[] dataToUpload = this.DataToUpload;
    int dataToUploadLength = dataToUpload.Length;
    int uploadedSoFar = 0;

    while (uploadedSoFar < dataToUploadLength) {
        int toUpload = 8192;
        if (uploadedSoFar + toUpload > dataToUploadLength) {
            toUpload = dataToUploadLength - uploadedSoFar;
        }

        requestStream.Write (dataToUpload, uploadedSoFar, toUpload);
        uploadedSoFar += toUpload;

        this.SetUploadedRatio ((float)uploadedSoFar / (float)dataToUploadLength);
}

问题是requestStream.Write()是即时的,直到发送大约100KB的数据,然后它变得更合乎逻辑,并且上面显示的SetUploadedRatio()方法被调用。当文件很大时,这并不是什么大不了的事,虽然我们仍然可以看到它立刻需要一些百分比然后开始慢一点。在慢速连接上,发送一个60KB的文件会导致显示进度条立即达到100%,但实际上传根本没有完成,所以我们无法真正显示正在发生的事情。

我做了一个暴露问题的完整展示(在Monotouch iOS上),链接如下: https://github.com/rFlex/Monotouch-Upload-Showcase

这是有趣的东西: https://github.com/rFlex/Monotouch-Upload-Showcase/blob/master/TestUpload/Uploader.cs

1 个答案:

答案 0 :(得分:0)

只要在调用GetRequestStream之前设置HttpWebRequest.ContentLength或HttpWebRequest.SendChunked,您发送的数据将在每次调用Stream时发送到服务器。[Begin] Write。如果您以小块的形式编写文件建议,您可以了解您的距离。