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终点。