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 メソッドは非常に頻繁に呼び出されます。たとえば、特定の 1 秒間に 7 つの通話が行われているとします。そして毎秒、それらの7つが続きます。
Post メソッドが「HttpStatusCode.Forbidden」を返すまで、アプリケーションは正常に動作します。Forbidden を返すと、次の呼び出しの一部が REST エンドポイントに到達しません。
これは、一部の接続が利用できないためですか? 例: "fobidden" ステータスと polly フォールバック ポリシーのために失われる接続はほとんどありませんか? (最大制限が 10 であるため) ?
それとも、これは Async とそのタイミングが原因で、2 回目の呼び出しが行われたときに接続がまだ使用されているためですか?
前もって感謝します