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示例。