我需要从Web API 2控制器调用外部api,类似于此处的要求:
Calling external HTTP service using HttpClient from a Web API Action
但是,上述解决方案要求将async
关键字添加到我的api方法的GET调用中,从而使我的调用变得异步。我更愿意为我的API客户端提供一个同步方法,但仍然能够从我自己的方法调用外部api(并且需要在我的api返回之前返回它)。有办法吗?
async
操作可能很危险。它会损害性能,并可能导致死锁(在Should I expose synchronous wrappers for asynchronous methods?中更多)但是如果您确定要这样做,最好使用GetAwaiter().GetResult()
的IMO:
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
。