HttpClient异步方法返回值

时间:2018-02-08 03:24:43

标签: c# http asynchronous

我在Internet上研究过Task Async方法,但似乎找不到将Task Async中的返回值分配给另一个对象的方法。第一种方法是准备HTTP请求头和Uri。

public static async Task MainAsync()
{
    string token = await AuthHelper.AcquireToken(tenantId, clientId, clientSecret);

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
        client.BaseAddress = new Uri("https://foo.net");
        await GetValue(client);
    }
}

第二种方法是使用GetAsync调用API来获取JSON,最后两行我只提取" " JSON正文中的字段。

public static async Task<String> GetValue(HttpClient client)
{
    string url = $"/mykey/key01";

    using (var httpResponse = await client.GetAsync(url))
    {
        httpResponse.EnsureSuccessStatusCode();
        string responsContent = await httpResponse.Content.ReadAsStringAsync();
        JObject json = JObject.Parse(responsContent);
        string value = json["value"].ToString();
        return value;
    }
}

现在我想使用此值来分配给另一个对象,但不知道如何这样做。我设法返回有效值。是否可以从另一个方法甚至不同的类中检索值?

[更新]主要功能是:

&#13;
&#13;
        static void Main(string[] args)
        {
            try
            {
                MainAsync().Wait();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.GetBaseException().Message);
            }
        }
&#13;
&#13;
&#13;

更新

更清楚。 HTTP响应消息是JSON格式,我可以从此JSON中的Value属性返回值。现在我如何重用外部方法或类

中的值

2 个答案:

答案 0 :(得分:1)

我不确定你想要实现的目标。关于你的架构会有彻底的争论,你可以做这样的事情......

更新

因为MainAsyncstatic,所以可以在任何地方调用它。

您只需稍微修改一下即可返回结果,如下所示:

public static async Task<string> MainAsync()
{
    ...
    return await GetValue(client);
    ...

以及其他地方

public class MyAwesomeClass
{
    public async Task DoMagic()
    {

       var newValueOfSomething = await MainAsync();
       // hilarity ensues
    }
}

答案 1 :(得分:0)

你可以使它更通用和有用,如下所示:

您的初始方法可以更改为:

   public async Task<T> GetContentAsync<T>(HttpClient client)
            {
                 string url = $"/mykey/key01";

        using (var httpResponse = await client.GetAsync(url))
        {
            httpResponse.EnsureSuccessStatusCode();
            string responsContent = await httpResponse.Content.ReadAsStringAsync();
            return Deserialize<T>(json);
        }
            }

 private T Deserialize<T>(string json)
        {
            return JsonConvert.DeserializeObject<T>(json, SerializationSettings);
        }

您现在可以调用以下方法:

var person = await GetContentAsync<Person>(/*http client*/)