[英]Polly log all requests with URL, Headers, Content and Response
我有一個從其他項目調用許多 rest 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 ) 中。
這是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 =>...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.