Search code examples
c#asp.net-web-api2dotnet-httpclienthttpresponsemessagegetasync

Null message on hTTPResponse.Content.ReadAsStringAsync().Result after 1st foreach loop


I have issue with null result messages when calling a HttpClient getAsync within a foreach loop.

I need to iterate with a list of objects for values to call an API via HttpClient. After the first loop, the HttpResponseMessage's result() comes up with null message.

I tried CacheControl.NoCache = true. It's not working.

public async Task<List<Common.ProgressResponse>> RunAsync()
{
    List<Response> ListOfResponses = new List<Responses>();

    try
    {
        _client.BaseAddress = new Uri([URL]);
        _client.DefaultRequestHeaders.Accept.Clear();
        _client.DefaultRequestHeaders.Clear();
        _client.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue() { NoCache = true };
        _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        _client.DefaultRequestHeaders.Add([KEY], [VALUE]);

        ListOfResponses = await SomeFunction();

    }
    catch (Exception ex)
    {
        //Exceptions here...
    }
    return ListOfResponses;
}


private async Task<List<ListOfResponses>> SomeFunction()
{
    List<Response> responses = new List<Response>();
    string aPISuffix = string.Format("{0}/{1}", [APISUFFIX1], [APISUFFIX2]);

    foreach (Object obj in ListOfObject)
    {
        _client.DefaultRequestHeaders.Add("Param1", obj.Param1);
        if (!string.IsNullOrEmpty(obj.Param2))
            _client.DefaultRequestHeaders.Add("Param2", obj.Param2);

        Response response = new Response();


/*This is where the issue is .begin.*/
        HttpResponseMessage hTTPResponse = await _client.GetAsync(aPISuffix).ConfigureAwait(false);
        string result = hTTPResponse.Content.ReadAsStringAsync().Result;
/*This is where the issue is .end.*/


        if (hTTPResponse.IsSuccessStatusCode)
        {
            response = [Code here...]
            //Codes here...
        }

        responses.Add(response);
    }

    return responses;
}

On: 'string result = hTTPResponse.Content.ReadAsStringAsync().Result;' I would expect the result message would have values as it loops through ListOfObjects.


Solution

  • Solved it... I moved the .DefaultRequestHeaders values inside the foreach() loop. I suspected that they were pilling up at every loop iteration. I had to clear them and set them up before the GetAsync()

    Updated code here:

    public async Task<List<Common.ProgressResponse>> RunAsync()
    {
        List<Response> ListOfResponses = new List<Responses>();
    
        try
        {
            _client.BaseAddress = new Uri([URL]);
            ListOfResponses = await SomeFunction();
    
        }
        catch (Exception ex)
        {
            //Exceptions here...
        }
        return ListOfResponses;
    }
    
    
    private async Task<List<ListOfResponses>> SomeFunction()
    {
        List<Response> responses = new List<Response>();
        string aPISuffix = string.Format("{0}/{1}", [APISUFFIX1], [APISUFFIX2]);
    
        foreach (Object obj in ListOfObject)
        {
            /*Moved Code .begin.*/
            _client.DefaultRequestHeaders.Accept.Clear();
            _client.DefaultRequestHeaders.Clear();
            _client.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue() { NoCache = true };
            _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            _client.DefaultRequestHeaders.Add([KEY], [VALUE]);      
    
            /*Moved Code .end.*/
    
            _client.DefaultRequestHeaders.Add("Param1", obj.Param1);
            if (!string.IsNullOrEmpty(obj.Param2))
                _client.DefaultRequestHeaders.Add("Param2", obj.Param2);
    
            Response response = new Response();
            HttpResponseMessage hTTPResponse = await _client.GetAsync(aPISuffix).ConfigureAwait(false);
    
            if (hTTPResponse.IsSuccessStatusCode)
            {
                string result = hTTPResponse.Content.ReadAsStringAsync().Result;        
                response = [Code here...]
                //Codes here...
            }
    
            responses.Add(response);
        }
    
        return responses;
    }