我有一个项目,该项目从其他项目中调用了许多其他API,并且我遇到了一些问题,不仅要识别这些API的错误,还要识别正确的响应,而在其他系统上信息不正确。我做了这部分,但是它只记录重试,我也需要记录成功。
services.AddHttpClient<IClient, Client>("AuthClient", x =>
{
x.BaseAddress = new Uri(urlAn);
}).AddPolicyHandler((services, request) =>
HttpPolicyExtensions.HandleTransientHttpError().WaitAndRetryAsync(
new[]
{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(5),
TimeSpan.FromSeconds(10)
},
onRetry: (outcome, timespan, retryAttempt, context) =>
{
services.GetService<ILogger>()
.LogWarning("Delaying for {delay}ms, then making retry {retry}.", timespan.TotalMilliseconds, retryAttempt);
}));
onRetry
仅当存在错误(由策略处理)时才执行该方法。该HandleTransientHttpError
触发器政策
HttpRequestException
要注入在每种情况下都应执行的逻辑,您需要使用自定义DelegatingHandler
。通过该扩展点,您可以将自定义代码注入HttpClient的管道(1)。
这是a的天真的实现LoggerHandler
:
class LoggerHandler: DelegatingHandler
{
private readonly ILogger<LoggerHandler> _logger;
public LoggerHandler(ILogger<LoggerHandler> logger)
{
_logger = logger;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
try
{
var response = await base.SendAsync(request, cancellationToken);
_logger.LogInformation(response.StatusCode.ToString());
return response;
}
catch (Exception ex)
{
_logger.LogError(ex, "Request has failed after several retries");
throw;
}
}
}
现在,让我们连接所有东西:
var retryPolicy = HttpPolicyExtensions.HandleTransientHttpError().WaitAndRetryAsync(
new[]
{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(5),
TimeSpan.FromSeconds(10)
});
services.AddHttpClient<IClient, Client>("AuthClient", x => { x.BaseAddress = new Uri(urlAn); })
.AddPolicyHandler(retryPolicy)
.AddHttpMessageHandler<LoggerHandler>();
请记住注册顺序很重要。
还有一些细微的事情可以改进:
HttpClient
,因为您正在使用Typed-Client。
services.AddHttpClient<IClient, Client>(x => ...)
IClient
和更好的命名Client
。想象一下您需要向应用程序中添加一个客户端的情况。怎么命名呢?AuthClient
可能是一个更好的名字:
services.AddHttpClient<IAuthClient, AuthClient>(x => ...)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句