我需要从我的 Web API 2 Controller 调用外部 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? 中)
但如果您确定那是您想要做的,IMO 最好使用 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
关于c# - 从 Web API 同步调用外部 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28551521/