HttpClient 和 windows phone 8 便携版

Posted

技术标签:

【中文标题】HttpClient 和 windows phone 8 便携版【英文标题】:HttpClient and windows phone 8 portable 【发布时间】:2014-07-28 06:59:22 【问题描述】:

我遇到了一个非常奇怪的问题。我试图做一个使用可移植库的 WP8.0 应用程序。在这个便携式库中,我使用的是 restsharp 便携式并且一切都很好,直到我开始做 GET 而不是 POST。再深入,我发现问题出在HttpClient,所以我只用HttpClient做了一个简单的代码,发现在以下场景中使用相同的代码,结果会有所不同: * 在 WP8+portable GET 不工作,调用不返回但 POST 工作正常 * 在 WP81 中正常

我正在对 www.google.com 进行 GET,对我自己的服务器进行 POST。我正在使用 WP8.1 模拟器进行测试。

有什么想法吗?

【问题讨论】:

你能澄清你的问题吗?您还可以在这里发布一些可能有帮助的代码示例吗? 【参考方案1】:

找到问题了!

我用来测试的代码是这样的:

  using (var client = new HttpClient())
  
       client.BaseAddress = new Uri("http://www.google.es/");
       client.DefaultRequestHeaders.Clear();
       client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
       HttpResponseMessage response = client.GetAsync("").Result;
       if (response.IsSuccessStatusCode)
       
         text = response.Content.ReadAsStringAsync().Result;
       
  

问题是在 GetAsync 中使用 Result。我不知道为什么,但如果我改为 等待客户端.GetAsync("");

在我的应用程序中,我有等待但***方法不是异步的代码,我使用 .Result。解决方案是在调用异步方法时不使用 .Result (我不知道它是适用于每个方法还是仅适用于 HttpClient 方法)。 POST 工作正常,因为它们采用异步方法。

【讨论】:

使用 .Result 会阻塞 UI 线程,因此如果在处理 HTTP 响应时尝试使用 UI 线程,您将遇到死锁。另外,尽量不要在每个请求上都创建一个新的 HttpClient,把它当作一个服务来对待,当你不再需要发出 Http 请求时将其拆除。

以上是关于HttpClient 和 windows phone 8 便携版的主要内容,如果未能解决你的问题,请参考以下文章

单元测试Windows.Web.Http HttpClient与模拟的IHttpFilter和IHttpContent,MockedHttpFilter抛出System.InvalidCastExce

在 Windows.Web.Http 和 System.Net.Http 中混淆使用哪个版本的 HttpClient;

详解 UWP (通用 Windows 平台) 中的两种 HttpClient API

HttpClient & Windows Auth:将登录的消费者用户传递给服务

通用 Windows 项目 - HttpClient 异常

Windows 身份验证不适用于 HttpClient [重复]