gpt4 book ai didi

c# - Httpclient 该实例已启动一个或多个请求。属性只能在发送第一个请求之前修改

转载 作者:行者123 更新时间:2023-12-02 01:09:33 25 4
gpt4 key购买 nike

我正在 .Net Core 2.1 中创建一个应用程序,并使用 http 客户端进行 Web 请求。问题是我必须发送并行调用以节省时间,为此我正在使用 Task.WhenAll() 方法,但是当我点击此方法时,我收到错误“此实例已启动一个或多个请求。只能修改属性”在发送第一个请求之前” 以前我使用 RestSharp,一切都很好,但我想使用 httpclient。这是代码:

public async Task<User> AddUser(string email)
{
var url = "user/";
_client.BaseAddress = new Uri("https://myWeb.com/");
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(Constants."application/json"));
_client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
var json = new {email = email }
var response = await _client.PostAsJsonAsync(url,json);
if (response .IsSuccessStatusCode)
{ ....

这是构造函数:

private readonly HttpClient _httpClient;

public UserRepository(HttpClient httpClient)
{
_httpClient = httpClient;
}

方法调用:

var user1 = AddUser("user@user.com");
var user2 = AddUser("test@test.com");

await Task.WhenAll(user1, user2);

这是启动配置:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

那我做错了什么?我是否需要用 AddTransient() 更改 AddSingleton 还是有任何其他问题。还有一个问题,我是否需要在响应后使用 _client.Dispose() ,因为我遵循的教程没有使用 dispose 方法,所以我对此有点困惑。

最佳答案

HttpClient.DefaultRequestHeaders(和BaseAddress)只能在发出任何请求之前设置一次。 HttpClient 仅当您在使用后不对其进行修改时,才可以安全地将其用作单例。

不要设置 DefaultRequestHeaders,而是在您发送的每个 HttpRequestMessage 上设置 header 。

var request = new HttpRequestMessage(HttpMethod.Post, url);
request.Headers.Accept.Clear();
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
request.Content = new StringContent("{...}", Encoding.UTF8, "application/json");
var response = await _client.SendAsync(request, CancellationToken.None);

"{...}" 替换为您的 JSON。

关于c# - Httpclient 该实例已启动一个或多个请求。属性只能在发送第一个请求之前修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51478525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com