如何解决验证我的DelegatingHandler已添加到IHttpClientBuilder
我有一些代码,将一个名为HttpClient
添加到ServiceCollection
并向客户端添加了一个DelegatingHandler
。示例代码:
public class MyDelegatingHandler : DelegatingHandler
{
// ...
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext,services) =>
{
services.AddHttpClient("MyClient")
.AddHttpMessageHandler(provider => new MyDelegatingHandler());
});
编写单元测试时,如何验证添加的DelegatingHandler
实现是MyDelegatingHanlder
?
解决方法
此信息存储在HttpClient
的专用字段中。您可以做到,但这有点不合常规。因此,您可能有兴趣也可能没有兴趣,但是如果您有兴趣,我将扔掉它。
public static class HttpClientExtensions
{
public static bool ContainsDelegatingHandler<TDelegatingHandler>(
this HttpClient httpClient) where TDelegatingHandler: DelegatingHandler
{
if(httpClient == null)
{
throw new ArgumentNullException(nameof(httpClient));
}
var internalHandlerField = typeof(HttpMessageInvoker).GetField(
"_handler",BindingFlags.NonPublic | BindingFlags.Instance);
if(internalHandlerField == null)
{
throw new InvalidOperationException(
"_handler no longer exists as a private instance field of HttpClient");
}
// run down the chain of delegating handlers until there are no more
var delegatingHandler = internalHandlerField.GetValue(httpClient) as DelegatingHandler;
while (delegatingHandler != null)
{
if(delegatingHandler.GetType() == typeof(TDelegatingHandler))
{
return true;
}
delegatingHandler = delegatingHandler.InnerHandler as DelegatingHandler;
}
return false;
}
}
要进行测试,您首先必须使用工厂创建一个HttpClient
:
var httpClient = httpClientFactory.CreateClient("MyClient");
然后通过扩展名运行它:
if(!httpClient.ContainsDelegatingHandler<MyDelegatingHandler>())
{
throw new Exception(
"HttpClient with name 'MyClient' does not contain " +
$"{nameof(MyDelegatingHandler)} delegating handler.");
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。