【发布时间】: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.Bcl 和 Microsoft.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