使用HttpClient和HttpRequestMessage的并发问题

问题描述 投票:1回答:1

我的代码看起来像这样:

private readonly HttpClient _httpClient;

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

public void SomeMethod(string reqUrl, string payload){
     var result = GetResponseStringAsync(reqUrl, payload).GetAwaiter().GetResult();
     // do something with result
}

private async Task<string> GetResponseStringAsync(string reqUrl, string payload){
     using (var req = new HttpRequestMessage("POST", reqUrl)){
          using (var content = new StringContent(payload)){
               // Attach content headers here (specific for each request)

               req.Content = content;
               // Attach request headers here (specific for each request)
               // using req.Headers.TryAddWithoutValidation()

               using (var response = await _httpClient.SendAsync(req))
               {
                   return await response.Content.ReadAsStringAsync();
               }
          }
     }
}

我需要发送每个请求具有不同的已签名标头的API请求,否则我将返回401(未授权)。就是说,当我发送单个请求时,我always得到200,表示授权标头已正确发送。但是,如果我一次发送多个请求(例如,将并发级别设置为10),则只有1个请求返回200,而其他9个获得401。但是,如果我分别单击这9个链接,则每个链接我都会得到200s,这与预期的一样。

在我看来,即使在我为每个请求创建一个新的HttpRequestMessage时,也存在一个并发问题,导致并没有将适当的标头附加到其对应的请求上。 HttpClient和HttpRequestMessage都应该是线程安全的,但是有人可以解释一下为什么一次发送多个请求时我仍然得到奇怪的结果吗?

c# dotnet-httpclient .net-4.6.2
1个回答
0
投票

我会将此添加为评论,但没有代表。

我放弃了内置的HttpClient,而选择了出色的RestClient库。试试看它是否显示相同类型的并发问题

private async Task<string> GetResponseStringAsync(string reqUrl, string payload)
{
    var client = new RestClient(reqUrl) { Encoding = Encoding.UTF8 };
    var request = new RestRequest { Method = Method.POST, RequestFormat = DataFormat.Json };
    request.AddHeader("Authorization", "Bearer " + _authResponse.AccessToken); // Example auth header
    request.AddParameter("application/json", payload, ParameterType.RequestBody); // Exampler payload
    var restResponse = await client.ExecuteTaskAsync(request);
}
© www.soinside.com 2019 - 2024. All rights reserved.