从Web API同步调用外部API

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

使用HttpClient从Web API操作调用外部HTTP服务

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

17

async操作上进行阻塞可能是危险的。它会影响性能并可能导致死锁(更多信息请参见是否应该为异步方法公开同步包装器?

但是,如果您确定这就是您想要做的,我认为最好使用GetAwaiter().GetResult()

using (HttpClient httpClient = new HttpClient())
{
    var response = httpClient.GetAsync(_endpoint).GetAwaiter().GetResult();
    var result = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
    // Do stuff...
}
无论是 Task 还是 Task<T>,调用await的效果相同(虽然使用await时任务已经完成),而Task.Result (或Task.Wait)会把任何异常包装在AggregateException 中,而GetAwaiter().GetResult() 仅抛出第一个Exception,就像await一样。

2
谢谢你提醒我...经过进一步的研究,我决定最好让客户决定是否异步调用API。我还找到了这篇文章,更简洁地解释了这个问题:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html - mayabelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接