C# 在WinRT中下载带有Post请求的文件

C# 在WinRT中下载带有Post请求的文件,c#,windows-runtime,microsoft-metro,async-await,C#,Windows Runtime,Microsoft Metro,Async Await,我有一个WCF服务,我想用一些参数向它发出post请求,它会返回一个文件。服务还可以,我使用curl进行了测试。文件大小约为20MB。我知道BackgroundDownloader是为这么大的文件制作的,但它不支持post请求 我的代码如下: var requestBody = "my parameters ..."; var handler = new HttpClientHandler { UseDefaultCredentials = true, AllowAutoRedirect = f

我有一个WCF服务,我想用一些参数向它发出post请求,它会返回一个文件。服务还可以,我使用curl进行了测试。文件大小约为20MB。我知道
BackgroundDownloader
是为这么大的文件制作的,但它不支持post请求

我的代码如下:

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
部分时,它总是失败,出现
任务被取消
异常

我使用类似的代码从该服务下载字符串(只需使用
ReadAsStringAsync
而不是
ReadAsStreamAsync
),效果很好


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

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

通过设置web.config中的元素或代码中的或属性,可以将WCF服务配置为接受GET请求。检查使用WebGet属性并返回流对象的示例

关于原始问题,您应该创建一个适当的WCF代理,如中所述。除了设置媒体类型外,Web服务调用还需要大量的头和正文设置。代理为您完成所有这些


下载文件时不要这样做。

看起来问题在于文件大小。我通过在
HttpClient

上设置一个高
Timeout
MaxResponseContentBufferSize
解决了这个问题。您可以发布完整的异常,包括它的堆栈跟踪吗?响应的结果是什么。确保成功状态码()?您是否尝试使用调试HTTP请求?WCF服务方法的定义是什么?@PauloMorgado在
响应之前抛出表达式。EnsureAccessStatusCode()
有什么异常?它扔到哪里去了?如果是htrown before EnsuccessStatusCode,则问题可能与WCF无关。BackgroundDownloader无法处理post请求,我无法控制WCF服务您收到了什么错误消息?如果你不告诉我们出了什么事,任何人都帮不了你。您是否尝试创建WCF服务引用?这是调用WCF服务的最简单方法。你试过用GET吗?如果它接受Json,可能它也已经配置好了。默认情况下,WCF不支持Json。也许配置它接受WCF的人也配置它接受GET