Я пытаюсь обернуть некоторый запрос API
[Route("foo")]
public Task Foo()
{
using var http = new HttpClient();
return http.PostAsync(
Endpoint,
new FormUrlEncodedContent(new Dictionary<string, string>
{
{ ClientId, "ClientId" },
}),
CancellationToken.None)
.ConfigureAwait(false);
}
и проблема с этим. Причина в файлах cookie, которые использует вызываемая конечная точка.
Есть ли способ перенести куки из моего текущего HttpContex
в HttpClient
Post call? Я знаю, что могу использовать CookieContainer
, HttpClientHandler
и передать все это в HttpClient
, но я бы хотел использовать что-то более элегантное.
@PeterCsala более чем достаточно, осталось только мигрировать на ядро 3.1
Просто возьмите заголовок Cookie
из входящего запроса и добавьте к исходящему. Установка заголовка для отдельного запроса потребует явного создания HttpRequestMessage
и использования HttpClient.SendAsync
для его отправки, но это довольно просто:
var outgoing = new HttpRequestMessage(HttpMethod.Post, uri);
outgoing.Content = new FormUrlEncodedContent(...);
if (Request.Headers.TryGetValue("Cookie", out var cookies))
{
outgoing.Headers.TryAddWithoutValidation("Cookie", cookies);
}
await http.SendAsync(outgoing);
спасибо, но концептуально это отличается от использования CookieContainer
?
Да, это сильно отличается. CookieContainer
— это высокоуровневая абстракция для имитации пользовательских «сеансов» так, как это делает браузер, и она тесно связана с HttpClient/Handler
. Все, что вы указали в своем вопросе, вы хотели бы избежать. Это простой способ переслать заголовок файла cookie напрямую для одного запроса.
Вам достаточно элегантности
AddHeaderPropagation
промежуточного программного обеспечения?