#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 непосредственно для одного запроса.