为了账号安全,请及时绑定邮箱和手机立即绑定

Httpclient 此实例已经启动了一个或多个请求。属性只能在发送第一个请求之前修改

Httpclient 此实例已经启动了一个或多个请求。属性只能在发送第一个请求之前修改

C#
守着星空守着你 2021-10-23 17:12:13
我正在 .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 方法,所以我对此有点困惑。
查看完整描述

3 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

也许我的两分钱会帮助某人。


我在调试应用程序时刷新页面时遇到了这个问题。


我使用的是单例,但每次刷新时,它都试图设置基地址。所以我只是把它包裹在一个检查中,看看是否已经设置了基地址。


我的问题是,它试图设置 baseAddress,即使它已经设置。您不能使用 httpClient 执行此操作。


if (_httpClient.BaseAddress == null)

{

    _httpClient.BaseAddress = new Uri(baseAddress);

}


查看完整回答
反对 回复 2021-10-23
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

该问题是由重置 httpclient 的同一实例的 BaseAddress 和标头引起的。


我试过


if (_httpClient.BaseAddress == null) 

但我并不热衷于此。


在我看来,更好的解决方案是使用 httpclientFactory。这将在使用后终止并垃圾回收 httpclient 的实例。


private readonly IHttpClientFactory _httpClientFactory;

public Foo (IHttpClientFactory httpClientFactory) 

{

_httpClientFactory = httpClientFactory;

}

public  httpresponse Bar ()

{

_httpClient = _httpClientFactory.CreateClient(command.ClientId);


using var response = await _httpclient.PostAsync(uri,content);

return response;

// here as there is no more reference to the _httpclient, the garbage collector will clean 

// up the _httpclient and release that instance. Next time the method is called a new 

// instance of the _httpclient is created

}


查看完整回答
反对 回复 2021-10-23
  • 3 回答
  • 0 关注
  • 245 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信