我正在使用 HttpClient 和 Polly 的 CircuitBreaker 来处理异常和非成功状态代码。
出于某种原因,CircuitBreaker 不会将非成功状态代码(例如 404)计为失败,即使它应该。
我的设置:
public class SomeExternalClientClass
{
private readonly HttpClient _httpClient;
public SomeExternalClientClass(IHttpClientFactory httpClientFactory)
{
_httpClient = httpClientFactory.CreateClient("HttpClientName");
}
public async Task Send()
{
try
{
...
var response = await _httpClient.SendAsync(request, cancellationToken);
...
}
catch (BrokenCircuitException brokenCircuitEx)
{
}
catch (Exception e)
{
}
}
}
services
.AddSingleton<..., SomeExternalClientClass>()
.AddHttpClient("HttpClientName")
.AddPolicyHandler(...)
return Policy<HttpResponseMessage>
.HandleResult(httpResponse => !httpResponse.IsSuccessStatusCode)
.Or<Exception>()
.CircuitBreakerAsync(
handledEventsAllowedBeforeBreaking: 3
durationOfBreak: TimeSpan.FromSeconds(180),
onBreak: (exception, span) =>
{
},
onReset: () =>
{
},
onHalfOpen: () =>
{
});
当抛出 Exception 时,CircuitBreaker 将其视为失败(并在相关时移动到 Open 状态,但是当返回 404 时,它可以一直发生而不会影响 CircuitBreaker。
有什么想法吗?
谢谢!