Метод FallbackAsync останавливает вызовы REST
public static IAsyncPolicy<HttpResponseMessage> GetSaveExceptionPolicy(
IServiceProvider serviceProvider)
{
return Policy
.HandleResult<HttpResponseMessage>(x => x.StatusCode == HttpStatusCode.Forbidden)
.FallbackAsync(new HttpResponseMessage(HttpStatusCode.OK),
d =>
{
var mediator = serviceProvider.GetService<IMediatorService>();
mediator.SaveFailedOnInvalidLock();
return Task.CompletedTask;
});
}
serviceCollection
.AddHttpClient<IMyClient, MyClient>(p =>
{
p.BaseAddress = baseAddress;
p.Timeout = TimeSpan.FromMinutes(10);
})
.ConfigurePrimaryHttpMessageHandler(sp => new HttpClientHandler() { MaxConnectionsPerServer = 10})
.AddPolicyHandler((serviceProvider, request) => GetSaveExceptionPolicy(serviceProvider));
это вызов посредника
public void SaveFailedOnInvalidLock()
{
_logger.Error($"Data Point Saving failed");
SaveFailedOnInvalidLock?.Invoke();
}
Эти методы MyClient Post вызываются очень часто. Например, в данную секунду происходит 7 вызовов. и на каждую секунду их 7 продолжений.
Приложение работает нормально, пока метод Post не вернет «HttpStatusCode.Forbidden». Когда он возвращает Forbidden, некоторые из следующих вызовов не достигают конечной точки REST.
Это связано с тем, что некоторые соединения недоступны? например: несколько соединений теряются из-за статуса «fobidden» и политики резервного копирования polly? (потому что максимальный предел равен 10)?
или это связано с асинхронностью и ее синхронизацией, так что соединения все еще используются, когда поступает вторая партия вызовов?
заранее спасибо
1 ответ
Я смог решить эту проблему, вернув одно и то же сообщение ответа http в резервном действии (вместо создания нового HTTPResponseMessage)
Я думаю, так как у меня есть
MaxConnectionsPerServer = 10
и я использую 7 из них в данный момент, если я вернусь
new HttpResponseMessage(HttpStatusCode.OK)
есть некоторые обработчики, которые не удаляются или не застревают.
Это моя новая политика
public static AsyncFallbackPolicy<HttpResponseMessage> GetDataPointSaveExceptionPolicy(
IServiceProvider serviceProvider)
{
return Policy
.HandleResult<HttpResponseMessage>(x=>
x.StatusCode == HttpStatusCode.Forbidden)
.FallbackAsync(
(res, cx, ct) =>
{
var dataServiceMediator = serviceProvider.GetService<IDataServiceMediatorService>();
dataServiceMediator.DataPointSaveFailedOnInvalidLock();
return Task.FromResult(res.Result);
},
(ct, cx) => Task.CompletedTask);
}
Это возвращает
Task.FromResult(res.Result)
и нет проблем с утилизацией и вызовов
MyClient
продолжает достигать конечной точки REST.