Как зарегистрировать заголовки или файлы cookie, добавленные в исходящий http-запрос с помощью SocketsHttpHandlerC#

Место общения программистов C#
Ответить
Anonymous
 Как зарегистрировать заголовки или файлы cookie, добавленные в исходящий http-запрос с помощью SocketsHttpHandler

Сообщение Anonymous »

У меня есть типизированный HttpClient, добавленный в DI следующим образом:

Код: Выделить всё

builder.Services
.AddHttpClient()
.ConfigurePrimaryHttpMessageHandler(() => ConfigureMessageHandler(env));

HttpMessageHandler ConfigureMessageHandler(IHostEnvironment hostEnv)
{
var handler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(5),
};
return handler;
}
По умолчанию SocketsHttpHandler.UseCookies = true. Это означает, что обработчик может добавить файл cookie к моему запросу.
В реализации моего клиента я пытаюсь зарегистрировать запрос со всеми его заголовками, но не вижу файла cookie, добавленного SocketsHttpHandler.

Код: Выделить всё

HttpRequestMessage requestMessage = new();
requestMessage.RequestUri = new(@"http://localhost:5044/WeatherForecast/EnumerateCookie");

requestMessage.Headers.Add("cookie", "MY_COOKIE=A");
requestMessage.Method = HttpMethod.Get;

using HttpResponseMessage response = await _httpClient.SendAsync(requestMessage);

var fullRequestHeaderList = HttpLogHelper.GetRequestHeaders(requestMessage);

Код: Выделить всё

public static Dictionary GetRequestHeaders(HttpRequestMessage requestMessage)
{
var headers = new Dictionary(StringComparer.OrdinalIgnoreCase);

foreach (var header in requestMessage.Headers)
{
var values = header.Value?.ToArray() ?? [];
headers[header.Key] = values.Length == 1 ? values[0] : values;
}

if (requestMessage.Content == null)
{
return headers;
}

foreach (var header in requestMessage.Content.Headers)
{
var values = header.Value?.ToArray() ?? [];

if (headers.TryGetValue(header.Key, out var existing))
{
var existingArray = existing is string s ? [s] : (string[])existing;
var merged = existingArray.Concat(values).ToArray();
headers[header.Key] = merged.Length == 1 ? merged[0] : merged;
}
else
{
headers[header.Key] = values.Length == 1 ? values[0] : values;
}
}

return headers;
}
Кроме того, requestMessage и responseMessage.requestMessage являются одним и тем же объектом.
Почему SocketsHttpHandler не обновляет объект responseMessage при изменении запроса?
Есть ли способ регистрировать (мы используем Serilog) результирующие заголовки запроса?>

Подробнее здесь: https://stackoverflow.com/questions/798 ... shttphandl
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»