Есть ли способ повторно использовать статический HTTP-клиент c # с несколькими учетными данными NTLM? - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь создать класс для доступа к конечной точке, защищенной NTLM, от имени пользователя.Однако я борюсь с концепцией сохранения статичности HttpClient, чтобы избежать риска использования слишком большого количества сокетов, при этом гарантируя, что учетные данные пользователей являются потокобезопасными.

Есть ли способ задания деталей аутентификации ntlm взаголовок отдельных запросов от клиента, так как я считаю, что они потокобезопасны?Или есть альтернативный подход к использованию клиента, который я не рассмотрел ниже?Бонусные баллы, если это позволяет httpclient быть высмеянным!

public class SampleClass
{
    private static HttpClient sharedClient;
    private static HttpClient threadSafeClient = new HttpClient();
    private static Uri uri = "http://test.com/ntlmEndpoint";

    public SampleClass(string domain, string username, string password)
    {
        HttpClientHandler handler = new HttpClientHandler();

        NetworkCredential credential = new NetworkCredential(username, password, domain);
        CredentialCache credentialCache = new CredentialCache();
        credentialCache.Add(uri, "NTLM", credential);
        handler.Credentials = credentialCache;

        //this is real bad as its not thread safe
        sharedClient = new HttpClient(handler);
    }

    //this works however is not thread safe
    public async Task<string> getDataAsyncNotThreadSafe(string key)
    {
        string endpoint = uri + "/" + key;
        HttpResponseMessage response = await sharedClient.GetAsync(endpoint);
        return await response.Content.ReadAsStringAsync(); 
    }


    public static async Task<string> getDataAsyncThreadSafe(string username, string password, string domain, string key)
    {
        string endpoint = uri + "/" + key;
        HttpResponseMessage response;
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, endpoint);

        //add Auth Header here somehow


        request.Headers.Authorization = header;
        response = await threadSafeClient.SendAsync(request);
        return await response.Content.ReadAsStringAsync();
    }
}
...