C# 我的应用程序不会重试连接。为什么?

C# 我的应用程序不会重试连接。为什么?,c#,asp.net-core,polly,C#,Asp.net Core,Polly,我正试着和波莉开始。请参见下面我的创业课程: public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection

我正试着和波莉开始。请参见下面我的创业课程:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services//.AddCustomMvc(Configuration)
             //.AddCustomAuthentication(Configuration)
             .AddHttpServices()
             .AddHttpClientServices(Configuration)
        .AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        //This is not changed.
    }
}

static class ServiceCollectionExtensions
{
    public static IServiceCollection AddHttpClientServices(this IServiceCollection services, IConfiguration configuration)
    {
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

        //register delegating handlers
        services.AddTransient<HttpClientAuthorizationDelegatingHandler>();
        services.AddTransient<HttpClientRequestIdDelegatingHandler>();
        services.AddHttpClient("extendedhandlerlifetime").SetHandlerLifetime(TimeSpan.FromMinutes(5));
        services.AddHttpClient<IValuesService, ValuesService>()
               .SetHandlerLifetime(TimeSpan.FromMinutes(5))  //Sample. Default lifetime is 2 minutes
               .AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
               .AddPolicyHandler(GetRetryPolicy())
               .AddPolicyHandler(GetCircuitBreakerPolicy());

        return services;
    }

    public static IServiceCollection AddHttpServices(this IServiceCollection services)
    {
        services.AddTransient<HttpClientAuthorizationDelegatingHandler>();
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddHttpClient<IValuesService, ValuesService>()
            .AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>()
            .AddPolicyHandler(GetRetryPolicy())
            .AddPolicyHandler(GetCircuitBreakerPolicy());
        return services;
    }


    static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
    {
        return HttpPolicyExtensions
          .HandleTransientHttpError()
          .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
          .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

    }
    static IAsyncPolicy<HttpResponseMessage> GetCircuitBreakerPolicy()
    {
        return HttpPolicyExtensions
            .HandleTransientHttpError()
            .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
    }
}
公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
服务//.AddCustomMvc(配置)
//.AddCustomAuthentication(配置)
.AddHttpServices()
.AddHttpClientServices(配置)
.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
//这一点没有改变。
}
}
静态类ServiceCollectionExtensions
{
公共静态IServiceCollection AddHttpClientServices(此IServiceCollection服务,IConfiguration配置)
{
services.AddSingleton();
//寄存器委派处理程序
services.AddTransient();
services.AddTransient();
services.AddHttpClient(“extendedhandlerlifetime”).SetHandlerLifetime(TimeSpan.FromMinutes(5));
services.AddHttpClient()
.SetHandlerLifetime(TimeSpan.FromMinutes(5))//示例。默认生存期为2分钟
.AddHttpMessageHandler()
.AddPolicyHandler(GetRetryPolicy())
.AddPolicyHandler(GetCircuitBreakerPolicy());
返回服务;
}
公共静态IServiceCollection AddHttpServices(此IServiceCollection服务)
{
services.AddTransient();
services.AddSingleton();
services.AddHttpClient()
.AddHttpMessageHandler()
.AddPolicyHandler(GetRetryPolicy())
.AddPolicyHandler(GetCircuitBreakerPolicy());
返回服务;
}
静态IAsyncPolicy GetRetryPolicy()
{
返回HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg=>msg.StatusCode==System.Net.HttpStatusCode.NotFound)
.WaitAndRetryAsync(6,retrytry=>TimeSpan.FromSeconds(Math.Pow(2,retrytry));
}
静态IAsyncPolicy GetCircuitBreakerPolicy()
{
返回HttpPolicyExtensions
.HandleTransientHttpError()
.CircuitBreakerAsync(5,从秒开始的时间跨度(30));
}
}
我使用的HTTPClient如下所示:

  public class ValuesService : IValuesService
        {
            private readonly HttpClient _apiClient;

            public ValuesService(HttpClient httpClient)
            {
                _apiClient = httpClient;

            }

            public async Task<string> GetValue()
            {
                var uri = API.Values.GetValues("http://localhost:55461/api");
                //The line below throws a SocketException
                var responseString = await _apiClient.GetStringAsync(uri);

                return responseString;
            }
        }
公共类值服务:IValuesService
{
私有只读HttpClient _apiClient;
公共价值服务(HttpClient HttpClient)
{
_apiClient=httpClient;
}
公共异步任务GetValue()
{
var uri=API.Values.GetValues(“http://localhost:55461/api");
//下面的行抛出一个SocketException
var responseString=await _apiClient.GetStringAsync(uri);
回报率;
}
}

GetValue()尝试访问Web API一次,然后失败。为什么不按配置多次尝试访问Web API?

策略规范

HttpPolicyExtensions.HandleTransientHttpError()
处理故障:

  • HttpRequestException
  • 状态代码>=500
  • 状态代码408
参考:

这反映了由处理的故障

另外,要处理
SocketException
,您可以像中的示例一样扩展策略。例如:

static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
    return HttpPolicyExtensions
      .HandleTransientHttpError()
      .Or<SocketException>()
      .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
      .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

}
static IAsyncPolicy<HttpResponseMessage> GetCircuitBreakerPolicy()
{
    return HttpPolicyExtensions
        .HandleTransientHttpError()
        .Or<SocketException>()
        .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
}
静态IAsyncPolicy GetRetryPolicy()
{
返回HttpPolicyExtensions
.HandleTransientHttpError()
.或()
.OrResult(msg=>msg.StatusCode==System.Net.HttpStatusCode.NotFound)
.WaitAndRetryAsync(6,retrytry=>TimeSpan.FromSeconds(Math.Pow(2,retrytry));
}
静态IAsyncPolicy GetCircuitBreakerPolicy()
{
返回HttpPolicyExtensions
.HandleTransientHttpError()
.或()
.CircuitBreakerAsync(5,从秒开始的时间跨度(30));
}


(根据对原始问题的评论,关于正在引发的
SocketException
和未发生重试,此答案解释了如何使策略处理
SocketException

它是如何失败的?@Mel Gerats,它无法重试连接到服务,即失败一次并引发异常。@w0051977“失败一次并引发异常”是什么意思?失败和异常是什么?@Alex Riabov,我识别的代码行抛出一个SocketException,程序立即存在。不应该重试吗?@Alex Riabov,我如何改进这个问题以获得答案?我甚至很难得到一个使用.NETCore2.1的基本polly示例。