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; });
в противном случае вы можете получить неожиданное поведение с помощью одного клиента и обмена другими куки.