asp.net core为IHttpClientFactory添加动态命名配置(2)

扩展点二: 需要实现自定义的IConfiguration配置, 只要this._optionsMonitor.Get(name)拿到的对象的HttpMessageHandlerBuilderActions属性包含我们相应的改写代码即可.

扩展点一的实现

为HttpClient的handler增加一个配置的filter, 针对符合的handlerBuilder增加一些自己的改写逻辑.
我们在用HttpClient对象的时候产生的日志("Sending HTTP request......","Received HTTP response headers after......")就是由这个Filter特性注入的. 官方参考代码:LoggingHttpMessageHandlerBuilderFilter

个人见解: 觉得在这个扩展点加这个业务不是特别的符合应用场景, 所以我建议在扩展点二做这个事情.

class MyHttpClientHandlerFilter : IHttpMessageHandlerBuilderFilter { public Action<HttpMessageHandlerBuilder> Configure(Action<HttpMessageHandlerBuilder> next) { void Configure(HttpMessageHandlerBuilder builder) { next(builder); //一开始就调用next, 这样我们的整个HandlerBuilder的执行顺序就是依次call _filters, 最后call options.HttpMessageHandlerBuilderActions(扩展点二). if (builder.Name.StartsWith("CallbackProviderSide-")) //我们可以为这类业务统一加一个前缀做区别, 这样就不会影响其他的HttpClient对象了. { //builder.PrimaryHandler= your custom handler. 参考官方文档的实现. } } return Configure; } } //然后在DI容器中注入我们的filter. ServiceCollection.AddSingleton<IHttpMessageHandlerBuilderFilter,MyHttpClientHandlerFilter>();

扩展点二的实现

class MyHttpClientCustomConfigure : IPostConfigureOptions<HttpClientFactoryOptions> { public void PostConfigure(string name, HttpClientFactoryOptions options) { if (name.StartsWith("CallbackProviderSide-")) //我们可以为这类业务统一加一个前缀做区别, 这样就不会影响其他的HttpClient对象了. { options.HttpMessageHandlerBuilderActions.Add(p => { //p.PrimaryHandler= your custom handler. 参考官方文档的实现. }); } } } //然后在DI容器中注入我们的这个配置扩展类. ServiceCollection.AddSingleton<Microsoft.Extensions.Options.IPostConfigureOptions<Microsoft.Extensions.Http.HttpClientFactoryOptions>, MyHttpClientCustomConfigure>();

为什么这里注入的类型是Microsoft.Extensions.Options.IPostConfigureOptions<Microsoft.Extensions.Http.HttpClientFactoryOptions>, 是因为OptionsFactory它的构造函数需要的就是这个. 至于有关Configuration系统的扩展和源代码在这里就不在这里展开了.

使用

至于用它就简单了

var factory = ServiceProvider.GetService<IHttpClientFactory>(); var httpClientForBaidu = factory.CreateClient("CallbackProviderSide-baidu"); var httpClientForCnblogs = factory.CreateClient("CallbackProviderSide-Cnblogs");

总结一下

这样子, 我们的这个运行时动态配置HttpClient就算完成了, 我也轻轻松松又水了一篇文章.
另外,有关IHttpClientFactory背后的故事可以查看文章Exploring the code behind IHttpClientFactory in depth, 很完整的流程图在配上代码, 把它讲解的清清楚楚.

以上就是asp.net core为IHttpClientFactory添加动态命名配置的详细内容,更多关于asp.net core 添加动态命名配置的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfdwp.html