Простой способ передачи файлов cookie из текущего HttpContext в новый созданный запрос HttpClient

#c# #.net #asp.net-web-api #cookies #dotnet-httpclient

#c# #.net #asp.net-веб-api #файлы cookie #dotnet-httpclient

Вопрос:

Я пытаюсь обернуть какой-то запрос 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, которые использует вызываемая конечная точка.

Есть ли какой-нибудь способ перенести файлы cookie из моего текущего HttpContex в HttpClient Post call? Я знаю, я могу использовать CookieContainer HttpClientHandler и передать все это HttpClient , но я хотел бы использовать что-то более элегантное.

Комментарии:

1.Достаточно ли элегантного AddHeaderPropagation промежуточного программного обеспечения для вас?

2. @PeterCsala более чем достаточно, осталось только перейти на ядро 3.1

Ответ №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);
 

Комментарии:

1. спасибо, но отличается ли это от использования CookieContainer концептуально?

2. Да, это совсем другое дело. CookieContainer это высокоуровневая абстракция для имитации пользовательских «сеансов» так, как это делал бы браузер, и она тесно связана с HttpClient/Handler . Всего этого, о чем вы заявили в своем вопросе, вы хотели бы избежать. Это простой способ переслать заголовок файла cookie непосредственно для одного запроса.