【问题标题】:HttpClient and windows phone 8 portableHttpClient 和 windows phone 8 便携版
【发布时间】: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 模拟器进行测试。

有什么想法吗?

【问题讨论】:

  • 你能澄清你的问题吗?您还可以在这里发布一些可能有帮助的代码示例吗?

标签: windows-phone-8 portable-class-library restsharp dotnet-httpclient xamarin.forms


【解决方案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 请求时将其拆除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多