HttpMessageHandler с BeforeRequest и AfterResponse

Задача: Добавить JWT токен перед отправкой HTTP запросов используя HttpMessageHandler. Имеется либа, которая принимает только HttpMessageHandler. Нужно реализовать это используя все бенефиты IHttpMessageHandlerFactory или другой фабрики.

Была такая идея, но не получится ткк HttpMessageHandler.SendAsync internal

public class InterceptableHttpMessageHandler : HttpMessageHandler
{
    private readonly HttpMessageHandler baseHandler;

    public InterceptableHttpMessageHandler(HttpMessageHandler baseHandler) // baseHandler from  IHttpMessageHandlerFactory 
    {
        
        this.baseHandler = baseHandler;
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // call "on before"
        this.baseHandler.SendAsync(...) // internal :(
    }
}

UPD

Создал запускаемый фидл: https://dotnetfiddle.net/lQwx2Y Фидл не решает проблему, ткк все равно HttpMessageHandler создается вручную, но примерно показывает проблему. И да, baseUrl должно меняется в рантайме, поэтому не уверен на счет неймд клиентов и всего такого.


Ответы (1 шт):

Автор решения: aepot

DelegatingHandler

public class InterceptableHttpMessageHandler : DelegatingHandler
{
    public InterceptableHttpMessageHandler(HttpMessageHandler innerHandler) : base(innerHandler)
    {

    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        this.OnBefore(request);

        return base.SendAsync(request, cancellationToken);
    }

    private void OnBefore(HttpRequestMessage request)
    {
        request.Headers.Add("testheader", "testheaderval");
    }
}
→ Ссылка