以下两种设置 HttpClient 的场景有什么区别吗?
我应该选择其中一种而不是另一种吗?
键入的客户端:
public class CatalogService
{
private readonly HttpClient _httpClient;
public CatalogService(HttpClient httpClient) {
_httpClient = httpClient;
}
public async Task<string> Get() {
var response = await _httpClient.GetAsync();
....
}
public async Task Post() {
var response = await _httpClient.PostAsync();
...
}
}
// Startup.cs
//Add http client services at ConfigureServices(IServiceCollection services)
services.AddHttpClient<ICatalogService, CatalogService>();
Run Code Online (Sandbox Code Playgroud)
IHttpClientFactory:
public class CatalogService
{
private readonly IHttpClientFactory _factory;
public CatalogService(IHttpClientFactory factory) {
_factory = factory;
}
public async Task<string> Get() {
var …Run Code Online (Sandbox Code Playgroud) c# async-await dotnet-httpclient asp.net-core httpclientfactory
或者:如何从静态方法记录。
从https://github.com/App-vNext/Polly你可以看到像这样的例子,其中记录器神奇地可用:
Policy
.Timeout(30, onTimeout: (context, timespan, task) =>
{
logger.Warn($"{context.PolicyKey} at {context.ExecutionKey}: execution timed out after {timespan.TotalSeconds} seconds.");
});
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我使用IHttpClientFactorydotnet core 2.1 中的新模式,并将其添加到我的 Startup.csConfigureServices方法中:
services.AddHttpClient<IMySuperHttpClient, MySuperHttpClient>()
.AddPolicyHandler(MySuperHttpClient.GetRetryPolicy())
.AddPolicyHandler(MySuperHttpClient.GetCircuitBreakerPolicy());
Run Code Online (Sandbox Code Playgroud)
静态且GetRetryPolicy看起来像这样:
internal static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
return HttpPolicyExtensions
.HandleTransientHttpError()
.OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
.WaitAndRetryAsync(
retryCount: 4,
sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
onRetry: OnRetry);
}
Run Code Online (Sandbox Code Playgroud)
其中OnRetry方法也必须是静态的:
private static void OnRetry(DelegateResult<HttpResponseMessage> delegateResult, TimeSpan timespan, Context context)
{
// var logger = ?? …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,我们可以在其中与数百个 HTTP 端点进行通信。该应用程序是某种代理。
在使用 polly 进行测试时,我注意到如果一个端点(比如api.endpoint1.com失败),对api.endpoint2.com和 的调用api.endpoint3.com也将处于打开/阻止状态。
这是有道理的,因为我只定义了一个策略,但是处理这种情况的推荐方法是什么,以便对不相关端点的调用不会因另一个端点出现性能问题而被阻止?
我是否创建一组策略,每个端点一个,或者是否有一种方法提供某种上下文键(即主机名)来将故障范围限制到给定的主机端点?
我已经查看了Polly 的有关上下文键的文档,看来这些是一种来回交换数据的方法,而不是我在这里寻找的。
var policy = Policy
.Handle<TimeoutException>()
.CircuitBreaker(1, TimeSpan.FromSeconds(1));
//dynamic, large list of endpoints.
var m = new HttpRequestMessage(HttpMethod.Post, "https://api.endpoint1.com")
{
Content = new StringContent("some JSON data here", Encoding.UTF8,"application/json")
};
policy.Execute(() => HTTPClientWrapper.PostAsync(message));
Run Code Online (Sandbox Code Playgroud)