Я просто пытаюсь создать простой тест, в котором я использую 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
.
Как я могу это сделать?
HttpClientFactory
не существует в .net 6
Вы должны установить 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
Клиент HttpClient = HttpClientFactory.Create (новый обработчик1(), новый обработчик2(), ..., новый обработчикN()); ?