同步从Web API调用外部api

may*_*lle 2 c# asynchronous web-services async-await asp.net-web-api

我需要从我的Web API 2控制器调用外部api,类似于此处的要求:

使用Web API Action中的HttpClient调用外部HTTP服务

但是,上面的解决方案需要将async关键字添加到我的api方法的GET调用中,从而使我的调用异步.我更喜欢用同步方法呈现我的API的客户端,但仍然可以从我自己调用外部api(并且需要在我的api返回之前返回).有没有办法做到这一点?

i3a*_*non 9

阻止async操作可能是危险的.它会损害性能并可能导致死锁(更多内容我应该为异步方法公开同步包装器吗?)

但如果您确定这是您想要做的,那么使用它会更好GetAwaiter().GetResult()!

using (HttpClient httpClient = new HttpClient())
{
    var response = httpClient.GetAsync(_endpoint).GetAwaiter().GetResult();
    var result = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
    // Do stuff...
}
Run Code Online (Sandbox Code Playgroud)

这是同样的它是否是一个Task或者Task<T>,这是相同的调用await转换为(虽然await任务已经完成)和Task.Result(或Task.Wait)包装中的任何异常AggregateException,而GetAwaiter().GetResult()只抛出了第一个Exceptionawait一样.

  • 谢谢你的提醒……经过一些进一步的研究,我确定让客户端决定是否异步调用 api 会更好。我还发现这篇文章更简洁地解释了这个问题:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html (2认同)