【问题标题】:Adding handler to default http client in ASP.NET Core [duplicate]将处理程序添加到 ASP.NET Core 中的默认 http 客户端 [重复]
【发布时间】:2018-08-01 21:43:50
【问题描述】:

有没有办法将处理程序添加到 ASP.NET Core 中的默认 HTTP 客户端? 像这样?

.AddHttpClient()
.AddHttpMessageHandler<Handler1>()
.AddHttpMessageHandler<Handler2>();

【问题讨论】:

  • 您可以在IServiceCollection 上添加一个名为AddHttpClient 的扩展方法,它可能需要一个DelegatingHandler,然后是services.AddSingleton(ctx =&gt; new System.Net.Http.HttpClient(handler));。问题是您只能在 HttpClient 构造函数中添加处理程序。
  • 确实,请记住,对于许多应用程序 (docs.microsoft.com/en-us/aspnet/core/fundamentals/…),不推荐使用单例而不是 IHttpClientFactory。但与往常一样,这取决于您的用例和代码库。

标签: c# asp.net-core asp.net-core-2.0 dotnet-httpclient


【解决方案1】:

文档说明您只能添加处理程序或将最内部的处理程序配置到命名或类型化的客户端。

参考Configure the HttpMessageHandler

可能需要控制客户端使用的内部 HttpMessageHandler 的配置。

添加命名或类型化客户端时返回IHttpClientBuilderConfigurePrimaryHttpMessageHandler 扩展方法可用于定义委托。委托用于创建和配置该客户端使用的主要HttpMessageHandler

services.AddTransient<Handler1>();
services.AddTransient<Handler2>();

services.AddHttpClient("configured-inner-handler")
    .AddHttpMessageHandler<Handler1>()
    .AddHttpMessageHandler<Handler2>();
    .ConfigurePrimaryHttpMessageHandler(() =>
    {
        return new HttpClientHandler()
        {
            AllowAutoRedirect = false,
            UseDefaultCredentials = true
        };
    });

【讨论】:

    【解决方案2】:

    查看DefaultHttpClientFactory的源码(既是IHttpClientFactory也是AddHttpClient方法注册的IHttpMessageHandlerFactory),发现注册一个自定义的IHttpMessageHandlerFactory是没有用的,因为@987654326 @ 从不需要它(但直接使用它自己的方法)。当然我们也可以注册一个自定义的IHttpClientFactory,但是有一个更简单的方法来实现我们想要的。

    这个想法是DefaultHttpClientFactory 在其IHttpMessageHandlerFactory 实现期间调用瞬态服务HttpMessageHandlerBuilder,所以我们所要做的就是注册一个自定义HttpMessageHandlerBuilder。例如:

    public class CustomHttpMessageHandlerBuilder : HttpMessageHandlerBuilder {
        public override string Name { get; set; }
        public override HttpMessageHandler PrimaryHandler { get; set; }
        public override IList<DelegatingHandler> AdditionalHandlers => new List<DelegatingHandler>();
        // Our custom builder doesn't care about any of the above.
        public override HttpMessageHandler Build() {
            return new HttpClientHandler {
                // Our custom settings
            };
        }
    }
    

    然后注册:

    services.AddTransient<HttpMessageHandlerBuilder, CustomHttpMessageHandlerBuilder>();
    

    而且它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 2012-02-20
      • 2017-09-05
      • 1970-01-01
      相关资源
      最近更新 更多