Chúng tôi đang tạo một trình bao bọc cho HttpClient. Vì chúng tôi sẽ thực hiện theo hướng dẫn tối ưu hóa hiệu suất từ https://github.com/mspnp/performance-optimization. Chúng tôi muốn tránh chống mẫu - Trình bày không đúng cách được đề cập trong tài liệu đó. Tôi đã giới thiệu hướng dẫn này cho nhóm của mình để sử dụng HttpClient tĩnh. Phản hồi tôi nhận được là an toàn chỉ. Mỗi yêu cầu có tiêu đề chứa xác nhận quyền sở hữu của người dùng. Kể từ khi tôi có một HttpClient tĩnh, nó sẽ được thread-an toàn? Nếu chúng ta có nhiều yêu cầu nhấn mã (ví dụ GET) cùng một lúc, nó sẽ là một điều kiện chủng tộc để thiết lập tiêu đề? Chúng tôi đã thực hiện như dưới đây.Tĩnh HttpClient thread an toàn trên 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());
}
}
Bất kỳ lý do gì mà 'CallHttpClientGet' không đồng bộ? Bằng cách gọi '.Result', bạn đang chặn luồng và mời các deadlocks tiềm ẩn. –