Wir erstellen einen Wrapper für HttpClient. Wir werden die Leitlinien zur Leistungsoptimierung von https://github.com/mspnp/performance-optimization befolgen. Wir wollen Anti-Pattern vermeiden - Unsaubere Instanziierung, die in diesem Dokument erwähnt wird. Ich habe diese Anleitung an mein Team weitergeleitet, um den statischen HttpClient zu verwenden. Das Feedback, das ich bekommen habe, ist auf Thread-Sicherheit. Jede Anfrage hat einen Header, der den Benutzeranspruch enthält. Da ich einen statischen HttpClient habe, wird es Thread-sicher sein? Wenn wir mehrere Anfragen gleichzeitig auf den Code (zum Beispiel GET) haben, wird es eine Race Condition sein, Header zu setzen? Wir haben die Implementierung wie folgt.Statische HttpClient Thread sicher auf 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());
}
}
Gibt es einen Grund, warum 'CallHttpClientGet' nicht asynchron ist? Durch Aufruf von '.Result' blockieren Sie den Thread und laden potenzielle Deadlocks ein. –