我有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
),并且工作正常。
有什么问题?或者这样做的正确方法是什么?
答案 0 :(得分:0)
您应该重新考虑使用BackgroundDownloader。即使您的应用暂停,后台下载也会继续。在WinRT应用程序中,您可以预期暂停会一直发生。强制用户在下载时保持您的应用运行不是一个好主意。
您可以通过在web.config中设置serviceMetadata元素或在代码中设置WebGet或WebInvoke属性来配置WCF服务以接受GET请求。检查Download File using WCF Rest Service以获取使用WebGet属性并返回Stream对象的示例。
关于您的原始问题,您应该按照Accessing WCF Services with a Windows Store Client App中的说明创建正确的WCF代理。除了设置媒体类型之外,Web服务调用还需要大量的标题和正文设置。代理为您完成所有这些。
不要下载文件。
答案 1 :(得分:0)
看起来问题是文件大小。我通过在Timeout
MaxResponseContentBufferSize
和HttpClient
来解决这个问题