c# - 第一次 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 时将具有值。
解决方案
更新:根据评论
首先,我通常会尽量避免将 .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以处理某些响应代码。
推荐阅读
- c++ - 是否可以在 C++ 中有类的查找表?
- javascript - 通过单击 HTML 链接将 1 添加到数据库记录
- firebase - 如何在flutter中计算200米内附近的人名单?
- angular - 无法在 html 模板中的对象上调用函数
- reactjs - 我如何通过道具来改变 react-select 组件的宽度
- c# - C# 8 理解 await 使用语法
- python - 如何在 sqlalchemyORM также 中获取查询
- r - 如何覆盖观察节点的值?
- python - 如果 XML 属性不存在则忽略它的 Pythonic 方式
- webpack - 即使我有正确的加载器,Webpack 也无法处理我的 SCSS 文件