在WinRT中使用Post请求下载文件

时间:2013-06-28 15:01:13

标签: c# windows-runtime microsoft-metro async-await

我有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),并且工作正常。

有什么问题?或者这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

您应该重新考虑使用BackgroundDownloader。即使您的应用暂停,后台下载也会继续。在WinRT应用程序中,您可以预期暂停会一直发生。强制用户在下载时保持您的应用运行不是一个好主意。

您可以通过在web.config中设置serviceMetadata元素或在代码中设置WebGetWebInvoke属性来配置WCF服务以接受GET请求。检查Download File using WCF Rest Service以获取使用WebGet属性并返回Stream对象的示例。

关于您的原始问题,您应该按照Accessing WCF Services with a Windows Store Client App中的说明创建正确的WCF代理。除了设置媒体类型之外,Web服务调用还需要大量的标题和正文设置。代理为您完成所有这些。

不要下载文件。

答案 1 :(得分:0)

看起来问题是文件大小。我通过在Timeout

上设置高MaxResponseContentBufferSizeHttpClient来解决这个问题