Как использовать PolicyHttpMessageHandler как «автономный»?

Я просто пытаюсь создать простой тест, в котором я использую DelegateHandlers для создания экземпляра HttpClient без использования пакетов Asp.net Core. У меня есть 2 обработчика удаления

  • ThrottlingDelegatingHandler
  • PolicyHttpMessageHandler (из пакета Полли)

Как я могу объединить оба и перейти к HttpClient?

var policy = HttpPolicyExtensions.HandleTransientHttpError().CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
var pollyHandler = new PolicyHttpMessageHandler(policy);
var http = new HttpClient(new ThrottlingDelegatingHandler(MaxParallelism, pollyHandler));

Вышеприведенное дает мне ошибку: System.InvalidOperationException : The inner handler has not been assigned.

У PolicyHttpMessageHandler нет конструктора, где я могу передать innerHandler.

Как я могу это сделать?

Клиент HttpClient = HttpClientFactory.Create (новый обработчик1(), новый обработчик2(), ..., новый обработчикN()); ?

Peter Csala 19.03.2022 22:13
HttpClientFactory не существует в .net 6
JobaDiniz 19.03.2022 22:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны установить InnerHandler в самом внутреннем обработчике на HttpClientHandler следующим образом:

var policy = HttpPolicyExtensions.HandleTransientHttpError().CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
var pollyHandler = new PolicyHttpMessageHandler(policy);

//New line
pollyHandler.InnerHandler = new HttpClientHandler();

var http = new HttpClient(new ThrottlingDelegatingHandler(MaxParallelism, pollyHandler));

В основном вам нужно установить следующий обработчик в конвейере.


Для справки: вот как строится HttpClient, если обработчик не указан

#region Constructors

public HttpClient() : this(new HttpClientHandler())
{
}

public HttpClient(HttpMessageHandler handler) : this(handler, true)
{
}

public HttpClient(HttpMessageHandler handler, bool disposeHandler) : base(handler, disposeHandler)
{
    _timeout = s_defaultTimeout;
    _maxResponseContentBufferSize = HttpContent.MaxBufferSize;
    _pendingRequestsCts = new CancellationTokenSource();
}

#endregion Constructors

Где base - это класс HttpMessageInvoker

Другие вопросы по теме