将处理程序添加到 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 => new System.Net.Http.HttpClient(handler));
。问题是您只能在 HttpClient
构造函数中添加处理程序。
确实,请记住,对于许多应用程序 (docs.microsoft.com/en-us/aspnet/core/fundamentals/…),不推荐使用单例而不是 IHttpClientFactory。但与往常一样,这取决于您的用例和代码库。
【参考方案1】:
文档说明您只能添加处理程序或将最内部的处理程序配置到命名或类型化的客户端。
参考Configure the HttpMessageHandler
可能需要控制客户端使用的内部 HttpMessageHandler 的配置。
添加命名或类型化客户端时返回
IHttpClientBuilder
。ConfigurePrimaryHttpMessageHandler
扩展方法可用于定义委托。委托用于创建和配置该客户端使用的主要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 6 将 Bootstrap 添加到脚手架 Identity _Layout.cshtml
无法将 JSON 发布到 ASP.NET Core RazorPage 处理程序