微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FallbackAsync 方法停止 REST 调用

如何解决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 端点。

这是因为某些连接不可用吗?例如:由于“禁止”状态和波利回退策略,很少有连接丢失? (因为最大限制是 10)?

或者这是由于 Async 及其时序导致第二批调用进入时连接仍在使用中?

提前致谢

解决方法

我能够通过在回退操作中返回相同的 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 端点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。