【问题标题】:How do I await a Windows.Web.Http.HttpClient.GetAsync()? Getting Intellisense error如何等待 Windows.Web.Http.HttpClient.GetAsync()?出现 Intellisense 错误
【发布时间】:2017-01-16 04:01:50
【问题描述】:

编辑:我已经在我的项目中使用 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 应用程序。我在项目的其他地方使用 await 。我的项目中已经添加了 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 信息:在意外时间调用了一个方法。

【问题讨论】:

  • 请参考this问题。
  • @AndreyAshikhmin 我在项目的许多其他地方都在使用 await。
  • 是的,但是您是在其他地方的IAsyncOperationWithProgress 上还是在Task 上使用await?稍后可能会正常工作,但是对于 IAsyncOperationWithProgress 上的 await 工作,它必须具有 GetAwaiter() 方法。在 Windows 8.1 及更高版本中,它作为系统命名空间中的扩展方法实现,但显然 Win8 没有它。
  • @AndreyAshikhmin 啊,我明白了。我会检查一下。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2019-10-27
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多