使用httpclient时出现系统异常

时间:2016-05-05 20:58:28

标签: c# windows-phone-8.1 win-universal-app

我的通用应用程序项目(通用Windows 8.1)存在问题。我想下载一个字符串然后反序列化到类。但我鼓励在Windows手机上下载此字符串时遇到问题。我有一个单独的lib。我只有httpclient下载字符串然后反序列化为类。一切正常(测试是绿色的),但当我把它插入windows phone app项目。它看起来像是在库代码中,但不会下载任何东西.. 我移动代码将字符串下载到Windows Phone解决方案,以检查它为什么不起作用。但是现在我不断得到这样的例外:

System.Exception: Exception from HRESULT: 0x80072F30
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at ProjectName.Mobile.MainPage.<InitComboBoxes>d__10.MoveNext()

这是我的代码:

private HttpClient client;
private CancellationTokenSource cts;
private HttpBaseProtocolFilter filter;

private async void Page_Loaded(object sender, RoutedEventArgs e)
{
    filter = new HttpBaseProtocolFilter();
    client = new HttpClient(filter);
    cts = new CancellationTokenSource();
    await InitComboBoxes();
}

private void Page_Unloaded(object sender, RoutedEventArgs e)
{
    filter?.Dispose();
    client?.Dispose();
    cts?.Dispose();
}

private async Task InitComboBoxes()
{
    try
    {
        var response = await client.GetAsync(new Uri(@"http://planer.info.pl/api/rest/places.json")).AsTask(cts.Token);
        var t = await response.Content.ReadAsStringAsync().AsTask(cts.Token);
    }
    catch (Exception e)
    {
        var msg = new MessageDialog("Please check Your internet connection!" + e.Message);
        await msg.ShowAsync();
    }
}

现在我不知道如何解决这个问题。如果有人能帮助我,我将非常感激!

2 个答案:

答案 0 :(得分:1)

看看你的代码,我没有看到任何特别的错误(我没有测试过);不同的是:

  • HttpResponseMessageIDisposable,因此您也应该考虑对其进行处理。

但是,这只是一些批评:P

根据MSDN查看异常,问题是您无法连接到服务器。

  

ERROR_WINHTTP_NO_CM_CONNECTION

     

0x80072F30

     

连接服务器时出现问题。

有很多方法可以解决这个问题:

  • 证书
  • 防火墙
  • 服务器已关闭

使用手机时,请确保手机上的时间设置正确(我已经看到这会导致很多问题)

它在库代码中,但不会下载任何内容..

我不确定你的意思,但是如果你的意思是它进入但没有返回,那么我怀疑是一个线程deadlock

希望这有帮助。

答案 1 :(得分:0)

如果您只想从网址获取数据,请尝试使用此代码。除非有理由这不符合您的需求吗?

    public async Task<string> GetData()
    {
        using (var client = new HttpClient())
        {
            try
            {
                HttpResponseMessage responseMessage = client.GetAsync("http://planer.info.pl/api/rest/places.json").Result;
                if (responseMessage.IsSuccessStatusCode)
                    return await responseMessage.Content.ReadAsStringAsync();
            }
            catch (Exception e)
            {
            }
        }
        return null;
    }

String response = await GetData();