我如何等待Windows.Web.Http.HttpClient.GetAsync()?获取智能感知错误

时间:2017-01-16 04:01:50

标签: c# asynchronous windows-store-apps windows-8.1-universal

编辑:我已在项目中使用Microsoft.Bcl.Async nuget包,但错误仍然存​​在。

我正在使用以下代码编写asnyc“确保URL是可访问的”方法:

public async Task<ConnectivityMonitorResult> TestModeUrlCheck(string url)
{
    try
    {
        var filter = new HttpBaseProtocolFilter();
        filter.IgnorableServerCertificateErrors.Add(Windows.Security.Cryptography.Certificates.ChainValidationResult.Expired);
        filter.IgnorableServerCertificateErrors.Add(Windows.Security.Cryptography.Certificates.ChainValidationResult.Untrusted);
        filter.IgnorableServerCertificateErrors.Add(Windows.Security.Cryptography.Certificates.ChainValidationResult.InvalidName);

        using (var httpClient = new Windows.Web.Http.HttpClient(filter))
        {
            var resp = await httpClient.GetAsync(new Uri(url), Windows.Web.Http.HttpCompletionOption.ResponseHeadersRead);

            if (resp.IsSuccessStatusCode)
                return new ConnectivityMonitorResult(ConnectivityType.Connected);
            else
                return new ConnectivityMonitorResult(ConnectivityType.NotConnected);
        }
    }
    catch(Exception ex)
    {
        return new ConnectivityMonitorResult(ConnectivityType.NotConnected, "Unhandled error: " + ex.Message);
    }   
}

此方法适用于我的应用的“测试模式”。 (生产检查方法将因SSL证书错误而失败)。它将使用自签名证书来访问本地开发服务器。

问题是由于var resp = await行上出现以下错误,因此无法构建此代码:

  

'IAsyncOperationWithProgress'确实如此   不包含'GetAwaiter'的定义和最佳扩展名   方法重载'AwaitExtensions.GetAwaiter(Task)'需要一个接收器   类型'任务'

我无法弄清楚如何正确构建GetAsync()调用以使其工作。

更新

这适用于使用便携式类库的Windows 8应用程序。我在项目的其他地方使用等待。我已将Microsoft.BclMicrosoft.Bcl.Async Nuget包添加到我的项目中。

更新

我尝试将代码更新为:

public async Task<ConnectivityMonitorResult> TestModeUrlCheck(string url)
{
    try
    {
        var filter = new HttpBaseProtocolFilter();
        filter.IgnorableServerCertificateErrors.Add(Windows.Security.Cryptography.Certificates.ChainValidationResult.Expired);
        filter.IgnorableServerCertificateErrors.Add(Windows.Security.Cryptography.Certificates.ChainValidationResult.Untrusted);
        filter.IgnorableServerCertificateErrors.Add(Windows.Security.Cryptography.Certificates.ChainValidationResult.InvalidName);

        using (var httpClient = new Windows.Web.Http.HttpClient(filter))
        {
            var resp = await Test(httpClient, url);

            if (resp.IsSuccessStatusCode)
                return new ConnectivityMonitorResult(ConnectivityType.Connected);
            else
                return new ConnectivityMonitorResult(ConnectivityType.NotConnected);
        }
    }
    catch(Exception ex)
    {
        return new ConnectivityMonitorResult(ConnectivityType.NotConnected, "Unhandled error: " + ex.Message);
    }   
}

private async Task<Windows.Web.Http.HttpResponseMessage> Test(Windows.Web.Http.HttpClient client, string apiUrl)
{
    var asyncOp = client.GetAsync(new Uri(apiUrl), Windows.Web.Http.HttpCompletionOption.ResponseHeadersRead);
    return await Task.Run(() => asyncOp.GetResults());
}

它已编译,但我收到了运行时错误:

  

WinRT信息:在意外时间调用了一个方法。

1 个答案:

答案 0 :(得分:0)

我通过更新项目目标解决了这个问题。该解决方案中的其他项目针对的是Windows8.1,而这个项目则针对的是Windows8。当我更新目标时,错误消失了,应用程序已构建并运行。