0

我有 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

问题是代码会到达该ReadAsStreamAsync部分,它总是会因A task was canceled异常而失败。

我使用类似的代码从该服务下载字符串(仅使用ReadAsStringAsync而不是ReadAsStreamAsync),它工作正常。

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

4

2 回答 2

0

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

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

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

只是不要为下载文件而这样做。

于 2013-07-03T08:16:03.997 回答
0

看起来问题出在文件大小上。我通过设置一个高点来解决TimeoutMaxResponseContentBufferSizeHttpClient

于 2013-07-03T09:32:02.197 回答