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方法返回"0";HttpStatusCode。Forbidden";。当它返回Forbidden时,接下来的一些调用不会到达REST端点。

这是因为某些连接不可用吗?例如:由于";fobidden";状态和polly后备策略?(因为最大限制是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终点。

相关内容

  • 没有找到相关文章

最新更新