gpt4 book ai didi

c# - 从 Web API 操作使用 HttpClient 调用外部 HTTP 服务

转载 作者:IT王子 更新时间:2023-10-29 04:21:42 25 4
gpt4 key购买 nike

我在 .Net Framework 4.5 上运行的 ASP.Net MVC 4 Web Api 项目中使用 HttpClient 调用外部服务

示例代码如下(忽略返回值,因为这是测试调用外部服务的示例代码):

public class ValuesController : ApiController
{
static string _address = "http://api.worldbank.org/countries?format=json";
private string result;

// GET api/values
public IEnumerable<string> Get()
{
GetResponse();
return new string[] { result, "value2" };
}

private async void GetResponse()
{
var client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(_address);
response.EnsureSuccessStatusCode();
result = await response.Content.ReadAsStringAsync();
}
}

虽然私有(private)方法中的代码确实有效,但我遇到的问题是 Controller Get() 调用 GetResponse() 但它不等待结果而是立即执行返回结果 = null。

我还尝试使用一个更简单的 WebClient 同步调用,如下所示:

 // GET api/values
public IEnumerable<string> Get()
{
//GetResponse();

var client = new WebClient();

result = client.DownloadString(_address);

return new string[] { result, "value2" };
}

效果很好。

我做错了什么?为什么 Get() 不等待异步示例中的私有(private)方法完成?

最佳答案

啊哈,我需要执行以下操作(返回一个 Task 而不是 void):

 // GET api/values
public async Task<IEnumerable<string>> Get()
{
var result = await GetExternalResponse();

return new string[] { result, "value2" };
}

private async Task<string> GetExternalResponse()
{
var client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(_address);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
return result;
}

我还没有意识到我可以将 Get() 操作标记为异步,这让我可以等待外部调用。

感谢 Stephen Cleary 的博文 Async and Await这为我指明了正确的方向。

关于c# - 从 Web API 操作使用 HttpClient 调用外部 HTTP 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13222998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com