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

C# 从Web API操作使用HttpClient调用外部HTTP服务,c#,asp.net-web-api,dotnet-httpclient,C#,Asp.net Web Api,Dotnet Httpclient,我正在从运行在.NETFramework 4.5上的ASP.NETMVC4WebAPI项目中使用HttpClient调用外部服务 示例代码如下(忽略返回值,因为这是测试调用外部服务的示例代码): 公共类值控制器:ApiController { 静态字符串_地址=”http://api.worldbank.org/countries?format=json"; 私有字符串结果; //获取api/值 公共IEnumerable Get() { GetResponse(); 返回新字符串[]{resu

我正在从运行在.NETFramework 4.5上的ASP.NETMVC4WebAPI项目中使用HttpClient调用外部服务

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

公共类值控制器:ApiController
{
静态字符串_地址=”http://api.worldbank.org/countries?format=json";
私有字符串结果;
//获取api/值
公共IEnumerable Get()
{
GetResponse();
返回新字符串[]{result,“value2”};
}
私有异步void GetResponse()
{
var client=新的HttpClient();
HttpResponseMessage response=wait client.GetAsync(_地址);
response.EnsureSuccessStatusCode();
结果=wait response.Content.ReadAsStringAsync();
}
}
虽然private方法中的代码确实有效,但我遇到的问题是,控制器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" };
    }
//获取api/值
公共IEnumerable Get()
{
//GetResponse();
var client=new WebClient();
结果=client.DownloadString(_地址);
返回新字符串[]{result,“value2”};
}
这很好用


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

Aha,我需要执行以下操作(返回任务而不是void):

//获取api/值
公共异步任务Get()
{
var result=等待GetExternalResponse();
返回新字符串[]{result,“value2”};
}
专用异步任务GetExternalResponse()
{
var client=新的HttpClient();
HttpResponseMessage response=wait client.GetAsync(_地址);
response.EnsureSuccessStatusCode();
var result=await response.Content.ReadAsStringAsync();
返回结果;
}
此外,我还没有意识到我可以将Get()操作标记为async,这使我能够等待外部调用


感谢斯蒂芬·克利里(Stephen Cleary)为我指出了正确方向的博文。

使用用户名和密码调用Httpclient。如果API要求身份验证

    public async Task<ActionResult> Index()
{

            const string uri = "https://testdoamin.zendesk.com/api/v2/users.json?role[]=agent";
            using (var client1 = new HttpClient())
            {
                var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("test@gmail.com:123456")));///username:password for auth
                client1.DefaultRequestHeaders.Authorization = header;
               var aa = JsonConvert.DeserializeObject<dynamic>(await client1.GetStringAsync(uri));

            }
}
公共异步任务索引()
{
常量字符串uri=”https://testdoamin.zendesk.com/api/v2/users.json?role[]=代理”;
使用(var client1=new HttpClient())
{
var header=新的AuthenticationHeaderValue(“基本”,Convert.ToBase64String(Encoding.ASCII.GetBytes()test@gmail.com:123456“);///用户名:验证密码
client1.DefaultRequestHeaders.Authorization=标题;
var aa=JsonConvert.DeserializeObject(等待client1.GetStringAsync(uri));
}
}

您不也需要用wait调用GetResponse()吗?否则,这不会等待该方法完成。。。您的控制器操作将直接完成,结果仍然为空。是的,但我没有意识到我可以将Get()标记为异步,这是使用wait所必需的。这正是我从过去3天以来一直在寻找的!知道了就简单:)最短最有效的答案。卡兰,谢谢你的努力,但这与问题无关。您的回答与身份验证有关,而问题与非身份验证api周围的异步任务有关
 // 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;
    }
    public async Task<ActionResult> Index()
{

            const string uri = "https://testdoamin.zendesk.com/api/v2/users.json?role[]=agent";
            using (var client1 = new HttpClient())
            {
                var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("test@gmail.com:123456")));///username:password for auth
                client1.DefaultRequestHeaders.Authorization = header;
               var aa = JsonConvert.DeserializeObject<dynamic>(await client1.GetStringAsync(uri));

            }
}