将处理程序添加到 ASP.NET Core 中的默认 http 客户端 [重复]

Posted

技术标签:

【中文标题】将处理程序添加到 ASP.NET Core 中的默认 http 客户端 [重复]【英文标题】:Adding handler to default http client in ASP.NET Core [duplicate] 【发布时间】: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。但与往常一样,这取决于您的用例和代码库。 【参考方案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>();

而且它有效。

【讨论】:

以上是关于将处理程序添加到 ASP.NET Core 中的默认 http 客户端 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 中的按操作身份验证处理程序

Asp.Net Core 6 将 Bootstrap 添加到脚手架 Identity _Layout.cshtml

无法将 JSON 发布到 ASP.NET Core RazorPage 处理程序

Asp.Net Core 第06局:中间件

有没有办法将元数据添加到 ASP.NET Core 中的所有 GET 端点?

匿名端点重定向到安全 ASP.Net Core Web 应用程序中的登录屏幕