Tworzymy wrapper dla HttpClient. Ponieważ będziemy postępować zgodnie z wytycznymi optymalizacji wydajności od https://github.com/mspnp/performance-optimization. Chcemy uniknąć wzorca antypoślizgowego - niewłaściwej instancji wspomnianej w tym dokumencie. Przekazałem te wskazówki mojemu zespołowi, aby używać statycznego HttpClient. Opinie, które otrzymałem, dotyczą bezpieczeństwa gwintów. Każde żądanie ma nagłówek zawierający roszczenie użytkownika. Ponieważ mam statyczny HttpClient, czy będzie bezpieczny dla wątków? Jeśli mamy kilka żądań, które uderzają w kod (na przykład GET) w tym samym czasie, czy będzie to warunek wyścigu do ustawienia nagłówka? Mamy implementację jak poniżej.Statyczny wątek HttpClient bezpieczny na 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());
}
}
Każdy powód, dla którego 'CallHttpClientGet' nie jest asynchronizowany? Przez wywołanie '.Result' blokujesz wątek i zapraszanie potencjalnych zakleszczeń. –