c# - 从 Web API 同步调用外部 API

标签 c# web-services asynchronous asp.net-web-api async-await

我需要从我的 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/

相关文章:

docker - 没有端点在(URL)监听可以接受消息错误的端点

Spring Security 和 @Async(经过身份验证的用户混在一起)

c# - 这对 sql 注入(inject)安全吗?

c# - 分配给 IList< > 或 List< >?

更改使用站点 SSL 证书后 ASP.NET Web 服务调用失败

Node.js - 使用异步库 - 带有对象的 async.foreach

javascript - 如何在页面加载时获取一些 JSON 文件? (同步必然不好)?

c# - c++/c# 系统和程序资源监控 - Windows

c# - 带有 Entity Framework Core : 'The process has no package identity' only when started without debugging 的 .NET 控制台应用程序

ios 应用程序使用 web 服务