如何为TestServer返回的HttpClient添加自定义HttpMessageHandler?
为TestServer的HttpClient添加自定义DelegatingHandler的方案
TestServer.CreateClient()没有直接传入自定义Handler的重载,但可以通过以下两种方式实现需求:
方案一:手动构建HttpClient并链入自定义Handler
直接将自定义Handler的InnerHandler指向TestServer的底层Handler,组合后创建HttpClient。
无依赖注入的Handler场景
如果你的HttpAuthenticationHandler不需要依赖其他服务,直接实例化配置即可:
[SetUp] public void Setup() { _server = new TestServer(new WebHostBuilder() .ConfigureServices((builder, services) => { services.AddRouting(); }) .Configure(app => { app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapGet("/api/helloworld", async context => { await context.Response.WriteAsync("Hello World"); }); }); })); // 实例化自定义Handler,关联TestServer的底层Handler var authHandler = new HttpAuthenticationHandler(); authHandler.InnerHandler = _server.CreateHandler(); // 用组合后的Handler创建HttpClient _client = new System.Net.Http.HttpClient(authHandler); }
需要依赖注入的Handler场景
如果Handler需要构造函数注入服务,先在TestServer的服务容器注册Handler,再获取实例配置:
[SetUp] public void Setup() { _server = new TestServer(new WebHostBuilder() .ConfigureServices((builder, services) => { services.AddRouting(); // 注册自定义Handler到服务容器 services.AddScoped<HttpAuthenticationHandler>(); }) .Configure(app => { app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapGet("/api/helloworld", async context => { await context.Response.WriteAsync("Hello World"); }); }); })); // 从服务容器获取Handler实例并关联TestServer底层Handler var authHandler = _server.Services.GetRequiredService<HttpAuthenticationHandler>(); authHandler.InnerHandler = _server.CreateHandler(); _client = new System.Net.Http.HttpClient(authHandler); }
方案二:使用HttpClientFactory配置(和常规应用一致)
如果你想和业务代码中使用HttpClientFactory的方式保持一致,可以在TestServer的服务配置里注册带自定义Handler的HttpClient:
[SetUp] public void Setup() { _server = new TestServer(new WebHostBuilder() .ConfigureServices((builder, services) => { services.AddRouting(); services.AddScoped<HttpAuthenticationHandler>(); // 注册带自定义Handler的HttpClient,指定底层用TestServer的Handler services.AddHttpClient("testClient") .AddHttpMessageHandler<HttpAuthenticationHandler>() .ConfigurePrimaryHttpMessageHandler(() => _server.CreateHandler()); }) .Configure(app => { app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapGet("/api/helloworld", async context => { await context.Response.WriteAsync("Hello World"); }); }); })); // 从HttpClientFactory获取配置好的客户端 _client = _server.Services.GetRequiredService<IHttpClientFactory>().CreateClient("testClient"); }
内容的提问来源于stack exchange,提问作者Q-bertsuit
相关产品推荐
相关产品推荐

