Мы создаем оболочку для HttpClient. Поскольку мы собираемся следовать рекомендациям по оптимизации производительности с https://github.com/mspnp/performance-optimization а>. Мы хотим избежать анти-шаблона — неправильного создания, упомянутого в этом документе. Я передал это руководство своей команде по использованию статического HttpClient. Отзывы, которые я получил, относятся к потокобезопасности. Каждый запрос имеет заголовок, содержащий утверждение пользователя. Поскольку у меня есть статический HttpClient, будет ли он потокобезопасным? Если у нас есть несколько запросов, попадающих в код (например, GET) одновременно, будет ли это условием гонки для установки заголовка? У нас есть реализация, как показано ниже.
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
, вы блокируете поток и провоцируете потенциальные взаимоблокировки. - person Todd Menier   schedule 21.04.2015