繁体   English   中英

使用HttpWebRequest监视上传进度

[英]Monitoring upload progress with HttpWebRequest

我最近编写了一个C#函数,该函数执行多部分表单发布以上传文件。 为了跟踪进度,我将表单数据一次以4096字节的速度写入请求流,并在每次写入时进行回调。 但是,似乎直到调用GetResponseAsync()才发送请求。

在这种情况下,写入请求流的每4096字节的报告是否是上传进度的准确报告?

如果没有,如何准确报告进度? WebClient对我来说是不可能的,这在PCL Xamarin项目中。

    private async Task<string> PostFormAsync (string postUrl, string contentType, byte[] formData)
    {
        try {
            HttpWebRequest request = WebRequest.Create (postUrl) as HttpWebRequest;

            request.Method = "POST";
            request.ContentType = contentType;

            request.Headers ["Cookie"] = Constants.Cookie;

            byte[] buffer = new byte[4096];
            int count = 0;
            int length = 0;
            using (Stream requestStream = await request.GetRequestStreamAsync ()) {
                using (Stream inputStream = new MemoryStream (formData)) {

                    while ((count = await inputStream.ReadAsync (buffer, 0, buffer.Length)) > 0) {
                        await requestStream.WriteAsync (buffer, 0, count);
                        length += count;
                        Device.BeginInvokeOnMainThread (() => {
                            _progressBar.Progress = length / formData.Length;
                        });
                    }   
                }
            }
            _progressBar.Progress = 0;

            WebResponse resp = await request.GetResponseAsync ();

            using (Stream stream = resp.GetResponseStream ()) {
                StreamReader respReader = new StreamReader (stream);
                return respReader.ReadToEnd ();
            }

        } catch (Exception e) {

            Debug.WriteLine (e.ToString ());
            return String.Empty;
        }
    }

请注意,我询问的是一次监视一次以4096字节上传而不是下载的进度

我最终通过将WebRequest的AllowWriteStreamBuffering属性设置为false并将SendChunked属性设置为true来完成此操作。

但是Xamarin.PCL(配置文件78)不允许您访问HttpWebRequest的这些属性,因此我必须实例化HttpWebRequest并从我的平台特定项目中的依赖项服务中将其返回(仅在iOS中进行了测试)。

public class WebDependency : IWebDependency
{
    public HttpWebRequest GetWebRequest(string uri)
    {
        var request = WebRequest.Create (uri) as HttpWebRequest;
        request.SendChunked = true;
        request.AllowWriteStreamBuffering = false;

        return request;

    }

}

然后实例化我的Web请求-

HttpWebRequest request = DependencyService.Get<IWebDependency>().GetWebRequest(uri);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM