如何“独立”使用PolicyHttpMessageHandler?

Job*_*niz 3 .net c# dotnet-httpclient polly .net-6.0

我只是想创建一个简单的测试,在其中实例DelegateHandlers化 aHttpClient而不带 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));
Run Code Online (Sandbox Code Playgroud)

上面给了我一个错误:System.InvalidOperationException : The inner handler has not been assigned.

没有PolicyHttpMessageHandler可以传递 的构造函数innerHandler

我怎样才能做到这一点?

Pet*_*ala 5

您必须将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));
Run Code Online (Sandbox Code Playgroud)

您基本上必须设置管道中的下一个处理程序。


供参考:如果未指定处理程序,这就是 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
Run Code Online (Sandbox Code Playgroud)

base班级HttpMessageInvoker在哪里