同步从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
那样。