c# - 向 TestServer 的 HttpClient 添加一个委托处理程序(传出请求中间件)
问题描述
是否可以将自定义DelegationHandler
(传出请求中间件)添加到HttpClient
由 asp.net 核心构建的TestServer
?
我正在尝试将用于影响的自定义可能性与内存测试实用程序结合起来:HttpClientFactory
HttpClients
TestServer
public class ExternalProxySslDowngradeSimulator : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken token)
{
if (request.RequestUri.Scheme == "https")
request.RequestUri = new Uri(
request.RequestUri.OriginalString.Replace("https:", "http:"));
return base.SendAsync(request, token);
}
}
[TestFixture
public class TestClass
{
[Test]
public async Task CallApi()
{
var builder = new WebHostBuilder()
.ConfigureAppConfiguration((ctx, config) => { })
.UseUrl("http://customDomain.com")
.UseStartup<CustomApi.Startup>();
var testServer = new Microsoft.AspNetCore.TestHost.TestServer(builder);
var httpClient = testServer.CreateClient();
var apiResult = await httpClient.GetAsync("https://customDomain");
}
}
我找不到将我DelegatingHandler
的插入HttpClient
返回的方法testServer.CreateClient()
到目前为止我已经尝试过:
- 注册一个自定义 HttpClientBuilder(不起作用):
// did not work:
var builder = new WebHostBuilder()
.UseStartup<CustomApi.Startup>()
.ConfigureServices(services =>
{
services
.AddHttpClient("")
.AddHttpMessageHandler<ExternalProxySslDowngradeSimulator>();
查看它的代码TestServer
并没有连接到该管道。
- 自定义
HttpClientFactoryOptions
(无效)
以为我可以绑定一个自定义HttpClientFactoryOptions
并将自定义操作添加到HttpClientFactoryOptions.HttpMessageHandlerBuilderActions
. 但是 TestServer 并没有像默认的 Http Client Factory 那样真正使用它。
- 自定义设置
TestServer
(不起作用)
浏览文档/源代码没有看到任何可以挂钩的地方。有一个扩展方法可以进一步控制 DI,但我没有看到这如何让我挂钩到HttpMessangeHandler
TestServer 正在使用的自定义。
解决方案
因此,您要做的是使用测试服务器(代码示例中的服务器)的 CreateHandler 方法和 HttpClientFactory.Create 方法创建自己的客户端。
var client = HttpClientFactory.Create(Server.CreateHandler(), new CustomDelegate() );
client.BaseAddress = Server.BaseAddress;
这让我花了很长时间才弄清楚。希望这对您有所帮助。
所以你的例子是
var httpClient = HttpClientFactory.Create(testServer.CreateHander(), new ExternalProxySslDowngradeSimulator());
httpClient.BaseAddress = testServer.BaseAddress;
推荐阅读
- asp.net-mvc - 在Vue中获取选择列表的选定值
- sql - 如何编写 SQL 脚本来查找与原始 ID 相关的所有关系?
- wordpress - 如何使我的 Wordpress 网站免受访客访问
- amazon-s3 - 以 parquet 格式将 json 数据从 kafka 写入 s3
- recursion - 从列表中删除第二次出现的给定项目 - 球拍
- python - 矩阵:仅在 numpy 数组的对角线位置放置负值
- testing - 通过 Bootstrap 配置 Netty EmbeddedChannel 的方法?
- highcharts - Highcharts React Wrapper 的问题:获取 Highcharts 错误 #18 但传递给普通 Highcharts Js 的相同选项工作正常
- c# - 无法在 ASP.NET MVC-C# 的级联下拉列表中获取 Chil 表列表
- awk - AWK如何在awk中的特定步骤中更改行?