C# как передать файл cookie с помощью общего HttpClient

у меня есть следующие настройки:

клиент -> JS в веб-API -> веб-API

мне нужно отправить файл cookie auth полностью вниз. Моя проблема заключается в отправке его из одного веб-api в другой. Из-за интеграции со старой системой, которая использует FormsAuthentication, я должен передать файл cookie auth.

по соображениям производительности я делюсь списком HttpClients (по одному для каждого веб-api) в следующем словаре:

private static ConcurrentDictionary<ApiIdentifier, HttpClient> _clients = new ConcurrentDictionary<ApiIdentifier, HttpClient>();

таким образом, учитывая идентификатор I может захватить соответствующий HttpClient.

следующие работы, но я уверен, что это плохой код:

HttpClient client = _clients[identifier];
var callerRequest = HttpContext.Current.Items["MS_HttpRequestMessage"] as HttpRequestMessage;
string authCookieValue = GetAuthCookieValue(callerRequest);

if (authCookieValue != null)
{
    client.DefaultRequestHeaders.Remove("Cookie");
    client.DefaultRequestHeaders.Add("Cookie", ".ASPXAUTH=" + authCookieValue);
}

HttpResponseMessage response = await client.PutAsJsonAsync(methodName, dataToSend);

// Handle response...

что не так в этом, что 1) кажется неправильным манипулировать DefaultRequestHeaders в запросе и 2) потенциально два одновременных запроса могут испортить файлы cookie, поскольку HttpClient является общим.

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

в какой-то момент у меня были запросы get, работающие с помощью HttpResponseMessage. Возможно, это может вдохновить на решение.

Итак, мой вопрос: есть ли способ установить cookies для одного запроса с помощью HttpClient, который будет безопасен для других клиентов, использующих тот же экземпляр?

1 ответов


вместо вызова PutAsJsonAsync () вы можете использовать HttpRequestMessage и SendAsync ():

Uri requestUri = ...;
HttpMethod method = HttpMethod.Get /*Put, Post, Delete, etc.*/;
var request = new HttpRequestMessage(method, requestUri);
request.Headers.TryAddWithoutValidation("Cookie", ".ASPXAUTH=" + authCookieValue);
request.Content = new StringContent(jsonDataToSend, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);

обновление: Чтобы убедиться, что ваш HTTP-клиент не хранит файлы cookie из ответа, вам нужно сделать следующее:

var httpClient = new HttpClient(new HttpClientHandler() { UseCookies = false; });

в противном случае вы можете получить неожиданное поведение с помощью одного клиента и обмена другими куки.