为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 .NET Core 中使用 HttpClientHandler

如何在 .NET Core 中使用 HttpClientHandler

C#
哈士奇WWW 2021-07-19 16:18:37
我想使用的HttpClientFactory是在.NET 2.1核心可用,但我也想用HttpClientHandler,以利用AutomaticDecompression创建时属性HttpClients。我很挣扎,因为.AddHttpMessageHandler<>需要一个DelegatingHandler不是HttpClientHandler.有谁知道如何让这个工作?
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

其实我没有使用自动解压,但实现这一点的方法是正确注册http客户端


services.AddHttpClient<MyCustomHttpClient>()

   .ConfigureHttpMessageHandlerBuilder((c) =>

     new HttpClientHandler()

     {

        AutomaticDecompression = System.Net.DecompressionMethods.GZip

     }

   )

   .AddHttpMessageHandler((s) => s.GetService<MyCustomDelegatingHandler>())


查看完整回答
反对 回复 2021-07-31
?
ITMISS

TA贡献1871条经验 获得超8个赞

通过 HttpClientBuilder 的 ConfigurePrimaryHttpMessageHandler() 方法定义主 HttpMessageHandler 更合适。请参阅下面的示例以配置类型化客户端。


services.AddHttpClient<TypedClient>()

    .ConfigureHttpClient((sp, httpClient) =>

    {

        var options = sp.GetRequiredService<IOptions<SomeOptions>>().Value;

        httpClient.BaseAddress = options.Url;

        httpClient.Timeout = options.RequestTimeout;

    })

    .SetHandlerLifetime(TimeSpan.FromMinutes(5))

    .ConfigurePrimaryHttpMessageHandler(x => new HttpClientHandler() 

    {

        AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

    })

    .AddHttpMessageHandler(sp => sp.GetService<SomeCustomHandler>().CreateAuthHandler())

    .AddPolicyHandlerFromRegistry(PollyPolicyName.HttpRetry)

    .AddPolicyHandlerFromRegistry(PollyPolicyName.HttpCircuitBreaker);

您还可以通过使用 Polly 库的特殊构建器方法来定义错误处理策略。在这个示例中,策略应该被预定义并存储到策略注册服务中。


public static IServiceCollection AddPollyPolicies(

    this IServiceCollection services, 

    Action<PollyPoliciesOptions> setupAction = null)

{

    var policyOptions = new PollyPoliciesOptions();

    setupAction?.Invoke(policyOptions);


    var policyRegistry = services.AddPolicyRegistry();


    policyRegistry.Add(

        PollyPolicyName.HttpRetry,

        HttpPolicyExtensions

            .HandleTransientHttpError()

            .WaitAndRetryAsync(

                policyOptions.HttpRetry.Count,

                retryAttempt => TimeSpan.FromSeconds(Math.Pow(policyOptions.HttpRetry.BackoffPower, retryAttempt))));


    policyRegistry.Add(

        PollyPolicyName.HttpCircuitBreaker,

        HttpPolicyExtensions

            .HandleTransientHttpError()

            .CircuitBreakerAsync(

                handledEventsAllowedBeforeBreaking: policyOptions.HttpCircuitBreaker.ExceptionsAllowedBeforeBreaking,

                    durationOfBreak: policyOptions.HttpCircuitBreaker.DurationOfBreak));


    return services;

}


查看完整回答
反对 回复 2021-07-31
  • 2 回答
  • 0 关注
  • 358 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信