Search code examples
c#.nethttpclientgetasync

HttpClient getAsync just works once


I'm trying to call a endpoint to get some info in my website but when I run the getAsync it's only works the first time in the current process.

static async Task Main(string[] args)
{

    await GetUserInfo("srmilton"); //Working
    await GetUserInfo("srmilton"); //Not Working

    while (true)
    {
        var res = await GetUserInfo("srmilton");
    }
}

public static async Task<(string,string)> GetUserInfo(string username)
{
    string url = "https://www.mywebsite.com/api/user/detail";
    var baseAddress = new Uri(url);

    using (var handler2 = new HttpClientHandler { UseCookies = false })
    using (var client2 = new HttpClient(handler2) { BaseAddress = baseAddress })
    {

        client2.DefaultRequestHeaders.Clear();
        client2.DefaultRequestHeaders.Add("Cookie", "session=zgbEqIjfSC7M7QdTTpHDkpWLt");
        client2.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
        AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36");
        client2.DefaultRequestHeaders.Add("x-requested-with", "XMLHttpRequest");
        client2.DefaultRequestHeaders.Add("referer", "https://www.mywebsite.com/");

        var result = await client2.GetAsync("");

        string responseString = await result.Content.ReadAsStringAsync();
        dynamic jsonresponse = JObject.Parse(responseString);
        id = jsonresponse.userInfo.user.id;
        sec_id = jsonresponse.userInfo.user.secUid;
        return (id, sec_id);
    }
}

The first time the fuction GetUserInfo is called it's return the correct json response from the api but the second loop gets stuck in GetAsync. I have already tried .ConfigureAwait(false), .Result and even creating HttpClient just once and reusing but it's aways hang on the second loop.

I don't know what i'm doing wrong, if someone can explain and show the right way to make this works i'll be thankful.


Solution

  • Solved. I was missing a Accept header on my getAsync headers.

    client2.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");