猿问

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

我正在 .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 方法,所以我对此有点困惑。


守着星空守着你
浏览 246回答 3
3回答

互换的青春

也许我的两分钱会帮助某人。我在调试应用程序时刷新页面时遇到了这个问题。我使用的是单例,但每次刷新时,它都试图设置基地址。所以我只是把它包裹在一个检查中,看看是否已经设置了基地址。我的问题是,它试图设置 baseAddress,即使它已经设置。您不能使用 httpClient 执行此操作。if (_httpClient.BaseAddress == null){&nbsp; &nbsp; _httpClient.BaseAddress = new Uri(baseAddress);}

慕田峪4524236

该问题是由重置 httpclient 的同一实例的 BaseAddress 和标头引起的。我试过if (_httpClient.BaseAddress == null)&nbsp;但我并不热衷于此。在我看来,更好的解决方案是使用 httpclientFactory。这将在使用后终止并垃圾回收 httpclient 的实例。private readonly IHttpClientFactory _httpClientFactory;public Foo (IHttpClientFactory httpClientFactory)&nbsp;{_httpClientFactory = httpClientFactory;}public&nbsp; 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&nbsp;// up the _httpclient and release that instance. Next time the method is called a new&nbsp;// instance of the _httpclient is created}
随时随地看视频慕课网APP
我要回答