同步从Web API调用外部api

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

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

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

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

但是如果你确定这是你想要做的,那么使用GetAwaiter().GetResult()更好的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都是一样的,它是await转换的同一个调用(虽然await已经完成的任务)和Task.Result (或Task.Wait )在GetAwaiter().GetResult()包装AggregateException任何exceptionGetAwaiter().GetResult()只抛出第一个Exception就像await那样。