Метод 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.

Другие вопросы по тегам