Мы создаем оболочку для HttpClient. Поскольку мы будем следовать руководству по оптимизации производительности от https://github.com/mspnp/performance-optimization. Мы хотим избежать анти-шаблона - неправильного экземпляра, упомянутого в этом документе. Я передал это руководство моей команде, чтобы использовать статический HttpClient. Обратная связь, которую я получил, касается безопасности потоков. Каждый запрос имеет заголовок, содержащий заявку пользователя. Поскольку у меня есть статический HttpClient, он будет потокобезопасным? Если у нас есть несколько запросов, поражающих код (например, GET) в одно и то же время, будет ли условие гонки задавать заголовок? У нас есть реализация, как показано ниже.Static HttpClient thread safe на ASP.net HttpRequest
public class HttpClientHelper{
private static readonly HttpClient _HttpClient;
static HttpClientHelper() {
HttpClient = new HttpClient();
HttpClient.Timeout = TimeSpan.FromMinutes(SOME_CONFIG_VALUE);
}
public async Task<HttpResponseMessage> CallHttpClientPostAsync(string requestUri, HttpContent requestBody)
{
AddHttpRequestHeader(httpClient);
var response = await httpClient.PostAsync(requestUri, requestBody); //Potential thread synchronization issue???
return response;
}
public HttpResponseMessage CallHttpClientGet(string requestUri)
{
AddHttpRequestHeader(httpClient);
var response = httpClient.GetAsync(requestUri).Result; //Potential thread synchronization issue???
return response;
}
private void AddHttpRequestHeader(HttpClient client)
{
string HeaderName = "CorrelationId";
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(Properties.Settings.Default.HttpClientAuthHeaderScheme, GetTokenFromClaims()); //Race condition???
if (client.DefaultRequestHeaders.Contains(HeaderName))
client.DefaultRequestHeaders.Remove(HeaderName);
client.DefaultRequestHeaders.Add(HeaderName, Trace.CorrelationManager.ActivityId.ToString());
}
}
Любая причина, по которой 'CallHttpClientGet' не является асинхронным? Вызывая «.Result», вы блокируете поток и приглашаете потенциальные блокировки. –