[英]Downloading a file with a Post request in WinRT
我有WCF服务,我想使用一些参数向其发出发布请求,它将返回一个文件。 服务还可以,我使用curl进行了测试。 该文件约为20 MB。 我知道BackgroundDownloader
是为如此大的文件制作的,但它不支持发布请求。
我的代码如下:
var requestBody = "my parameters ...";
var handler = new HttpClientHandler { UseDefaultCredentials = true, AllowAutoRedirect = false };
var client = new HttpClient(handler);
HttpContent httpContent = new StringContent(requestBody, Encoding.UTF8, "application/json");
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
HttpResponseMessage response = await client.PostAsync("the url...", httpContent);
response.EnsureSuccessStatusCode();
var stream = await response.Content.ReadAsStreamAsync();
///some code to store the stream to a file
问题在于代码bever到达ReadAsStreamAsync
部分,由于A task was canceled
异常而总是失败。
我使用类似的代码从该服务下载字符串(仅使用ReadAsStringAsync
而不是ReadAsStreamAsync
),并且工作正常。
问题是什么? 或执行此操作的正确方法是什么?
您应该重新考虑使用BackgroundDownloader。 即使您的应用暂停,后台下载也会继续。 在WinRT应用程序中,您可以期望暂停始终发生。 强迫用户在下载时保持应用程序运行不是一个好主意。
您可以配置一个WCF服务通过设置接受GET请求serviceMetadata在web.config中或元素WebGet或WebInvoke代码属性。 有关使用WebGet属性并返回Stream对象的示例,请检查使用WCF Rest Service的下载文件 。
关于您的原始问题,您应该创建适当的WCF代理,如使用Windows Store Client App访问WCF服务中所述 。 除了设置媒体类型之外,Web服务调用还需要大量的标头和主体设置。 代理会为您完成所有这些工作。
只是不要下载文件。
看来问题出在文件大小。 我通过在HttpClient
上设置较高的Timeout
和MaxResponseContentBufferSize
来解决此问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.