首页 > 解决方案 > 第一次 foreach 循环后 hTTPResponse.Content.ReadAsStringAsync().Result 上的空消息

问题描述

在 foreach 循环中调用 HttpClient getAsync 时出现空结果消息的问题。

我需要使用对象列表进行迭代,以获取通过 HttpClient 调用 API 的值。在第一个循环之后,HttpResponseMessage 的 result() 出现空消息。

我试过 CacheControl.NoCache = true。它不工作。

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;
}

开:'字符串结果 = hTTPResponse.Content.ReadAsStringAsync().Result;' 我希望结果消息在循环通过 ListOfObjects 时将具有值。

标签: c#asp.net-web-api2dotnet-httpclienthttpresponsemessagegetasync

解决方案


更新:根据评论

首先,我通常会尽量避免将 .Result 用于任务。我也不认为添加缓存标头是问题,因为您正在进行服务器到服务器的调用。

我经常做的一件事是在尝试阅读之前评估响应。我也更喜欢使用 HttpRequestMessage 以便我可以管理它的处置。

这是一个演示如何调用的快速示例:

using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace Testing
{
    class Program
    {
        static void Main(string[] args)
        {
            TestAsync().Wait();
        }

        static async Task TestAsync()
        {
            var urls = new string[]
            {
                "https://stackoverflow.com/questions/57084989/null-message-on-httpresponse-content-readasstringasync-result-after-1st-foreac",
                "https://stackoverflow.com/users/2025711/rogala"
            };

            using (var httpClient = new HttpClient())
            {
                foreach (var url in urls)
                {
                    using (var request = new HttpRequestMessage(HttpMethod.Get, url))
                    {
                        Console.WriteLine($"Request: {url}".PadLeft(5,'*').PadRight(5, '*'));
                        var response = await httpClient.SendAsync(request)
                            .ConfigureAwait(false);

                        if (response.IsSuccessStatusCode)
                        {
                            var body = await response.Content.ReadAsStringAsync()
                            .ConfigureAwait(false);
                            Console.WriteLine($"{body.Length}{Environment.NewLine}");
                        }
                        else
                        {
                            Console.WriteLine($"*Bad request: {response.StatusCode}");
                        }
                        
                    }
                }
            }

            Console.ReadKey();
        }
    }
}

要记住的另一件事是套接字耗尽。如果此代码在服务器上运行,那么一旦您的服务获得一些负载,您将遇到套接字耗尽。我强烈建议使用HttpClientFactory来处理 HttpClients。

关于内容字符串为空的原因,可能是因为服务器没有返回可能是服务器问题的内容。服务器可能还限制了您,导致没有内容。我建议调查Polly以处理某些响应代码。


推荐阅读