同时从Web API调用外部api

问题描述 投票:3回答:1

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

Calling external HTTP service using HttpClient from a Web API Action

但是,上述解决方案要求将async关键字添加到我的api方法的GET调用中,从而使我的调用变得异步。我更愿意为我的API客户端提供一个同步方法,但仍然能够从我自己的方法调用外部api(并且需要在我的api返回之前返回它)。有办法吗?

c# web-services asynchronous asp.net-web-api async-await
1个回答
10
投票
阻塞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
© www.soinside.com 2019 - 2024. All rights reserved.