.net core Polly断路器未与.net core HTTP客户端保持状态

.net core Polly断路器未与.net core HTTP客户端保持状态,.net-core,startup,dotnet-httpclient,polly,circuit-breaker,.net Core,Startup,Dotnet Httpclient,Polly,Circuit Breaker,我已经实施了polly重试和断路器策略(wrapped)。当呼叫失败且前一次呼叫的电路开路时,下一次呼叫将再次转到重试并再次点击断路器,而不是仅仅抛出断路器异常。我认为,尽管我使用的是类型化的客户机,HTTP客户机还是在重新创建。我无法理解这个问题。这是密码 启动 public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersio

我已经实施了polly重试和断路器策略(wrapped)。当呼叫失败且前一次呼叫的电路开路时,下一次呼叫将再次转到重试并再次点击断路器,而不是仅仅抛出断路器异常。我认为,尽管我使用的是类型化的客户机,HTTP客户机还是在重新创建。我无法理解这个问题。这是密码

启动

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        services.AddHttpClient<IIntCall, IntCall>().WrapResilientPolicies();
    }
public void配置服务(IServiceCollection服务)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddHttpClient().wrapResilientPolicys();
}
接口

public interface IIntCall
    {
        Task<bool> DoSomething();
    }
公共接口IIntCall
{
任务DoSomething();
}
实施:

public class IntCall : IIntCall
    {
    private readonly HttpClient client;

    public IntCall(HttpClient httpClient)
    {
        this.client = httpClient;
    }

    public async Task<bool> DoSomething()
    {
        var response = await client.GetAsync("http://www.onegoogle.com");
        var content = await response.Content.ReadAsStringAsync();
        return false;
    }
}
公共类IntCall:IIntCall
{
私有只读HttpClient;
公共IntCall(HttpClient HttpClient)
{
this.client=httpClient;
}
公共异步任务DoSomething()
{
var response=wait client.GetAsync(“http://www.onegoogle.com");
var content=await response.content.ReadAsStringAsync();
返回false;
}
}
波利实现

public static class CBExtensions
    {
        public static void WrapResilientPolicies(this IHttpClientBuilder builder)
        {
            builder.AddPolicyHandler((service, request) =>
            GetRetryPolicy().WrapAsync(GetCircuitBreakerPolicy()));
        }

    private static IAsyncPolicy<HttpResponseMessage> GetCircuitBreakerPolicy()
    {
        return HttpPolicyExtensions.HandleTransientHttpError()
            .CircuitBreakerAsync(3, TimeSpan.FromSeconds(30), (result, retryAttempt) =>
            {
                Debug.WriteLine("circuit broken");
            },
            () =>
            {
                Debug.WriteLine("circuit closed");
            });
    }

    private static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
    {
        return HttpPolicyExtensions.HandleTransientHttpError()
            .Or<Exception>(e => !(e is BrokenCircuitException))
          .WaitAndRetryAsync(3,
              retryAttempt => TimeSpan.FromMilliseconds(500),
              onRetry: (context, attempt) =>
              {
                  Debug.WriteLine("error");
              }
          );
    }
}
公共静态类扩展
{
公共静态无效WrapResilientPolicys(此IHttpClientBuilder生成器)
{
builder.AddPolicyHandler((服务、请求)=>
GetRetryPolicy().WrapAsync(GetCircuitBreakerPolicy());
}
私有静态IAsyncPolicy GetCircuitBreakerPolicy()
{
返回HttpPolicyExtensions.HandletTransientHttpError()
.CircuitBreakerAsync(3,TimeSpan.FromSeconds(30),(结果,重试尝试)=>
{
调试。写入线(“电路断路”);
},
() =>
{
调试写入线(“电路闭合”);
});
}
私有静态IAsyncPolicy GetRetryPolicy()
{
返回HttpPolicyExtensions.HandletTransientHttpError()
.或(e=>!(e是BrokenCircuiteException))
WaitandertryAsync先生(3,
RetryTest=>TimeSpan.From毫秒(500),
onRetry:(上下文,尝试)=>
{
Debug.WriteLine(“错误”);
}
);
}
}

我发现了问题所在。因为我正在获取请求详细信息,所以每次调用都会注入策略,因此状态会被更新。我把代码从

public static void WrapResilientPolicies(this IHttpClientBuilder builder)
        {
            builder.AddPolicyHandler((service, request) =>
            GetRetryPolicy().WrapAsync(GetCircuitBreakerPolicy()));
        }
对此

public static void WrapResilientPolicies(this IHttpClientBuilder builder)
        {
            builder.AddPolicyHandler(
                GetRetryPolicy().WrapAsync(GetCircuitBreakerPolicy()));
        }

+1.对于任何需要更多解释的人,Polly和HttpClientFactory文档包括以下内容: