ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RestSharp 依赖注入集成指南:在 ASP.NET Core 中借助 IHttpClientFactory 注册默认与命名客户端

RestSharp 依赖注入集成指南:在 ASP.NET Core 中借助 IHttpClientFactory 注册默认与命名客户端 后端API设计【免费下载链接】RestSharpSimple REST and HTTP API Client for .NET项目地址https://gitcode.com/gh_mirrors/re/RestSharp点击查看免费下载导读本文讲解 RestSharp 官方提供的RestSharp.Extensions.DependencyInjection包它让RestClient无缝融入 Microsoft 的依赖注入DI容器并接入IHttpClientFactory统一管理HttpClient与消息处理器的创建和生命周期。读完本文你将掌握在 ASP.NET CoreWebApplicationBuilder中注册默认客户端、命名客户端、按需注入IRestClient或通过IRestClientFactory按名称解析客户端以及结合序列化配置如 Newtonsoft.Json完成完整初始化从而避免手动管理HttpClient生命周期带来的 DNS 缓存等经典问题。为什么需要依赖注入集成RestSharp 内部使用HttpClient发送 HTTP 请求。如果每个服务都自行new RestClient(...)HttpClient实例及其底层HttpMessageHandler连接池就会失去统一管理容易出现众所周知的 DNS 解析缓存失效、socket 耗尽等问题。RestSharp.Extensions.DependencyInjection包解决了这个痛点集中管理命名与配置为逻辑客户端如github统一命名和配置默认客户端供通用场景使用托管连接池与生命周期底层HttpMessageHandler的池化与回收由IHttpClientFactory负责规避手动管理RestClient生命周期时的常见 DNS 问题。从源码看该包只引用了一个外部包Microsoft.Extensions.Http见 RestSharp.Extensions.DependencyInjection.csproj其余依赖均来自仓库内的 RestSharp 项目本身集成非常轻量。安装包使用该集成需要先引用RestSharp.Extensions.DependencyInjection包。在支持中央包管理的项目中可参考 Directory.Packages.props 中已有的版本管理方式或直接通过 NuGet 添加dotnet add package RestSharp.Extensions.DependencyInjection安装后即可在Program.cs中通过扩展方法完成注册下文所有示例均基于 ASP.NET Core 的WebApplicationBuilder。注册默认客户端Default client在Program.cs中调用AddRestClient()即可一次性注册IHttpClientFactory、IRestClientFactory与IRestClientvar builder WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRestClient();之后任何服务都可以通过构造函数注入IRestClient使用public class GetReposModel(IRestClient client) : PageModel { public IEnumerableGitHubBranch? GitHubBranches { get; set; } public async Task OnGet() { var request new RestRequest(https://api.github.com/repos/RestSharp/RestSharp/branches); var response await client.ExecuteGetAsyncIEnumerableGitHubBranch(request); if (response.IsSuccessful) { GitHubBranches response.Data; } } }提示GetReposModel使用的主构造函数语法是 C# 12 的特性若项目目标框架较低可改为普通构造函数注入。带配置的默认客户端注册默认客户端时还可以传入基础地址或自定义选项AddRestClient提供了多个重载见 ServiceCollectionExtensions.cs// 指定基础地址 builder.Services.AddRestClient(new Uri(https://api.github.com)); // 提供自定义选项 var options new RestClientOptions(https://api.github.com) { Timeout TimeSpan.FromSeconds(5), // 注意对象初始化器内多个属性之间用逗号分隔 }; builder.Services.AddRestClient(options);RestClientOptions的常用属性包括BaseUrl、Timeout、Authenticator、ConfigureMessageHandler、CalculateResponseStatus、Interceptors等完整定义见 RestClientOptions.cs。传RestClientOptions实例时扩展方法内部会通过CopyFrom将其复制到新选项对象源码第 74–77、101–104 行避免直接共享可变实例。用委托方式配置默认客户端除了传Uri或RestClientOptions还可以传一个配置委托这便于读取builder.Configuration等上下文builder.Services.AddRestClient(options { options.BaseUrl new Uri(https://api.github.com); options.Timeout TimeSpan.FromSeconds(5); });注册命名客户端Named client当应用需要多个配置不同的客户端例如一个调用 GitHub API、另一个调用 Twilio API时应使用命名客户端。给客户端起一个有意义的名称之后就能通过IRestClientFactory按名称取回。例如注册名为github的客户端var options new RestClientOptions(https://api.github.com) { Timeout TimeSpan.FromSeconds(5), }; builder.Services.AddRestClient(github, options);应用组件中通过IRestClientFactory获取客户端实例public class GetReposModel(IRestClientFactory factory) : PageModel { public IEnumerableGitHubBranch? GitHubBranches { get; set; } public async Task OnGet() { var request new RestRequest(/repos/RestSharp/RestSharp/branches); var client factory.CreateClient(github); var response await client.ExecuteGetAsyncIEnumerableGitHubBranch(request); if (response.IsSuccessful) { GitHubBranches response.Data; } } }注意命名客户端下请求可以使用相对路径因为BaseUrl已在注册时指定。最灵活的命名注册委托 序列化配置命名客户端同样支持传Uri或RestClientOptions。最具扩展性的重载允许在注册时同时配置客户端选项和序列化器builder.Services.AddRestClient( my-client, options { options.BaseUrl new Uri(https://api.github.com); options.Timeout TimeSpan.FromSeconds(1); options.Authenticator new GitHubAuthenticator(builder.Configuration[GitHub:ApiToken]); }, serialization serialization.UseNewtonsoftJson() );第一个委托参数类型为ConfigureRestClient即delegate void ConfigureRestClient(RestClientOptions options)见 RestClient.cs用于配置选项第二个委托参数类型为ConfigureSerializationdelegate void ConfigureSerialization(SerializerConfig config)同见 RestClient.cs可调用UseNewtonsoftJson()等序列化扩展方法来自RestSharp.Serializers.NewtonsoftJson包指定 JSON 处理方案。源码解析注册背后发生了什么AddRestClient的实现位于 ServiceCollectionExtensions.cs核心流程如下创建选项var options new RestClientOptions();随后调用configureRestClient(options)应用用户配置注册命名 HttpClientservices.AddHttpClient(name).ConfigurePrimaryHttpMessageHandler(...)并在此处通过RestClient.ConfigureHttpMessageHandler(handler, options)将 RestSharp 选项映射到底层HttpClientHandler这是连接池统一托管的关键注册工厂单例services.TryAddSingletonIRestClientFactory, DefaultRestClientFactory()默认客户端特判若name Constants.DefaultRestClient即DefaultRestClient见 Constants.cs额外注册IRestClient的瞬时Transient服务工厂解析时从IHttpClientFactory取出命名的HttpClient并包装为RestClient命名客户端配置存储非默认名称则通过services.ConfigureRestClientConfigOptions(...)把配置委托存起来供工厂稍后读取。DefaultRestClientFactory的实现见 DefaultRestClientFactory.cs展示了按名解析的完整链路public IRestClient CreateClient(string name) { var options optionsMonitor.Get(Constants.GetConfigName(name)); // 取出配置 var httpClient httpClientFactory.CreateClient(name); // 由 IHttpClientFactory 创建复用连接池 return new RestClient(httpClient, true, options.ConfigureRestClient, options.ConfigureSerialization); }其中IRestClientFactory接口只暴露IRestClient CreateClient(string name)一个方法见 IRestClientFactory.cs设计上保持简单。RestClientConfigOptions见 RestClientConfigOptions.cs则用于承载注册时保存的ConfigureRestClient与ConfigureSerialization委托。这里值得注意RestSharp 的RestClient构造函数本身就支持useClientFactory: true参数见 RestClient.cs依赖注入包正是把这一能力与IHttpClientFactory深度绑定将HttpClient的创建权完全交给工厂。生命周期与连接池说明IRestClient以 Transient 方式注册每次注入都会得到一个新RestClient实例但底层HttpClient与HttpMessageHandler来自IHttpClientFactory的命名池连接被复用实例开销极小IRestClientFactory为单例任何作用域内注入的都是同一工厂实例由于HttpClient由工厂管理AddRestClient注册时通过ConfigurePrimaryHttpMessageHandler配置的选项如超时、凭据等会在 handler 创建时生效自动规避手动new HttpClient()时频繁创建导致的 DNS 缓存问题。关于HttpClient复用与选项生效范围的更多细节可参考文档 client.md 中 “Reusing HttpClient” 一节当传入自建HttpClient实例时RestClientOptions中仅BaseUrl、Timeout、UserAgent、Expect100Continue等有限选项生效。而依赖注入集成走的是工厂路径选项映射发生在 handler 配置阶段行为更可控。测试验证仓库在test/RestSharp.Tests.DependencyInjection/下提供了针对该集成的测试项目例如 DefaultClientRequestTests.cs 演示了最小化的验证方式var services new ServiceCollection(); services.AddRestClient(new Uri(server.Url!)); var provider services.BuildServiceProvider(); // 解析并执行请求 protected override IRestClient GetClient() provider.GetRequiredServiceIRestClient();其余测试文件还包括 NamedClientWithBaseUrlRequestTests.cs 与 NamedClientWithOptionsRequestTests.cs分别覆盖命名客户端按BaseUrl与按自定义选项注册的解析场景可作为集成行为的事实依据。该包自身的快速上手说明见 README.md。小结RestSharp.Extensions.DependencyInjection让 RestSharp 以官方、标准的方式融入现代 .NET 应用的 DI 体系一条AddRestClient()即可完成默认客户端注册AddRestClient(name, ...)则支持多命名客户端与IRestClientFactory按名解析配合委托配置还能同时设置认证器与序列化器。连接池与生命周期交给IHttpClientFactory后应用代码只需关注业务客户端实例的复用、DNS 刷新与资源回收全部由框架托管。赞分享后端API设计【免费下载链接】RestSharpSimple REST and HTTP API Client for .NET项目地址https://gitcode.com/gh_mirrors/re/RestSharp点击查看免费下载相关推荐Beekeeper Studio 连接与使用 Amazon DynamoDB 实战指南Beekeeper Studio 连接与使用 Amazon DynamoDB 实战指南 Amazon DynamoDB 是 AWS 托管的 NoSQL 键值/文后端API设计5分钟上手RestSharp依赖注入ASP.NET Core服务注册全攻略5分钟上手RestSharp依赖注入ASP.NET Core服务注册全攻略 你是否还在ASP.NET Core项目中手动创建 RestClient 实例频繁后端API设计dapper-dot-net依赖注入在ASP.NET Core中集成Dapperdapper dot net依赖注入在ASP.NET Core中集成Dapper 在ASP.NET Core开发中数据访问层的设计直接影响应用性能和可维护性数据库ORM后端上一篇3分钟解锁Zotero全部潜力插件市场让你的文献管理效率翻倍下一篇罗技PUBG压枪宏用Lua脚本实现终极后坐力控制的完整技术指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表