.NET Core 1.1中如何为AutoRest生成的构造函数注入DelegatingHandler数组
解决AutoRest生成客户端的DelegatingHandler注入问题(.NET Core 1.1)
别担心,DelegatingHandler其实就是用来给HTTP请求/响应加自定义逻辑的"中间件",比如日志、重试、统一加请求头这些,在.NET Core 1.1的DI体系里注入它其实很简单,我给你一步步讲清楚:
1. 先搞懂DelegatingHandler的作用(可选)
简单来说,它能拦截你的客户端发出的每一个HTTP请求,在请求发送前或者响应返回后执行自定义代码——比如给所有请求自动加上Authorization头,或者记录每个请求的耗时,这在实际项目里特别实用。
2. 注册自定义DelegatingHandler(如果需要的话)
如果你有自定义的handler(比如日志handler),先实现它:
public class LoggingDelegatingHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { // 请求发送前的逻辑:记录请求地址 Console.WriteLine($"请求地址:{request.RequestUri}"); // 继续执行后续handler或发送请求 var response = await base.SendAsync(request, cancellationToken); // 响应返回后的逻辑:记录状态码 Console.WriteLine($"响应状态码:{response.StatusCode}"); return response; } }
然后在Startup.cs的ConfigureServices里注册这个handler:
services.AddTransient<LoggingDelegatingHandler>(); // 如果有多个自定义handler,逐个注册就行
3. 注入DelegatingHandler数组到AutoRest客户端
AutoRest生成的客户端构造函数接受params DelegatingHandler[] handlers,我们可以利用DI容器获取所有注册的handler,然后传给客户端:
public void ConfigureServices(IServiceCollection services) { // 先注册自定义handler(如果有) services.AddTransient<LoggingDelegatingHandler>(); // 注册AutoRest生成的客户端 services.AddScoped<YourAutoRestClientName>(sp => { // 从DI容器中获取所有注册的DelegatingHandler实例,转成数组 var handlers = sp.GetServices<DelegatingHandler>().ToArray(); // 实例化客户端,传入handlers(如果有base地址等其他参数也要加上) return new YourAutoRestClientName(new Uri("https://your-api-base-url.com"), handlers); // 如果客户端构造函数不需要base地址,直接传handlers就行: // return new YourAutoRestClientName(handlers); }); // 其他服务注册... }
4. 只注入特定的Handler(可选)
如果你不想注入所有注册的handler,只想传某几个特定的,也可以手动获取:
services.AddScoped<YourAutoRestClientName>(sp => { var loggingHandler = sp.GetRequiredService<LoggingDelegatingHandler>(); // 比如还有一个重试handler var retryHandler = sp.GetRequiredService<RetryDelegatingHandler>(); // 直接把需要的handler传给构造函数 return new YourAutoRestClientName(loggingHandler, retryHandler); });
注意事项
- 在.NET Core 1.1里,
GetServices<T>方法属于Microsoft.Extensions.DependencyInjection命名空间,确保你的项目引用了对应的NuGet包(一般默认已经包含)。 - 如果不需要任何自定义handler,直接传空数组或者调用不带handlers参数的构造函数就行——
params参数允许传0个元素。
内容的提问来源于stack exchange,提问作者Renato Fontes
相关产品推荐
相关产品推荐

