首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从Web API操作中使用HttpClient调用外部HTTP服务

从Web API操作中使用HttpClient调用外部HTTP服务
EN

Stack Overflow用户
提问于 2012-11-05 05:15:24
回答 2查看 50.5K关注 0票数 30

我正在使用HttpClient从运行在.Net Framework4.5上的ASP.Net MVC4WebApi项目中调用外部服务

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

代码语言:javascript
复制
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();
    }
}

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

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

代码语言:javascript
复制
 // GET api/values
    public IEnumerable<string> Get()
    {
        //GetResponse();

        var client = new WebClient();

        result = client.DownloadString(_address);

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

它工作得很好。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-05 05:59:18

啊哈,我需要做以下事情(返回一个任务而不是void):

代码语言:javascript
复制
 // 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()操作标记为async,这是我等待外部调用的原因。

感谢Stephen Cleary的博客帖子Async and Await,它为我指明了正确的方向。

票数 40
EN

Stack Overflow用户

发布于 2017-12-29 20:14:37

使用用户名和密码调用Httpclient。API需要认证的情况下。

代码语言:javascript
复制
    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));

            }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13222998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档