我是HttpClient httpClient从课外注射的。
在我的类中,我正在创建一个新的 HttpClientHandlervar handler = new HttpClientHandler()并设置其值。
我需要链接HttpClientHandler到现有的,HttpClient就像使用构造函数一样:new HttpClient(handler)
是否可以?我尝试在其中寻找HttpClientHandler财产HttpClient,但它不存在。还有其他办法吗?
当使用 HttpClient 实例和 HttpClientHandler 实例(.Net Framework,不使用 Core)时,是否可以稍后以任何方式访问 HttpClientHandler 实例/它的属性(用于只读目的)?
不幸的是,创建 HttpClientHandler 实例作为变量供以后引用是不可能的,因为 HttpClient 实例作为参数传递给库,我们无法更改调用客户端。
例如,我想实现这样的目标:
// Created in client we cant modify
var client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = True, PreAuthenticate = True });
// Class we can modify
public void DoSomething(HttpClient client)
{
if (client.HttpClientHandler.UseDefaultCredentials == True) Console.WriteLine("UseDefaultCredentials: True");
}
Run Code Online (Sandbox Code Playgroud) 使用HttpClient并不像我希望的那么简单。尽管它是一种IDisposable类型,但将其包装在声明中并不是最佳实践using,甚至将其设置为单例也是理想的选择。HttpClientHandler但是,当您将 a 传递给类似的构造函数时会怎么样HttpClient:
using (var client = new HttpClient(singletonHttpClientHandler, false);
Run Code Online (Sandbox Code Playgroud)
我见过像上面这样的代码,其中HttpClient故意将 包裹在using语句中,但HttpClientHandler是单例。文档表明客户端处理程序已被处理,除非第二个参数指示false如上面所做的那样:
使用 HttpClient 的部分问题是一些事情,比如超时必须与该 HttpClient 的所有实例共享,因此出于这个原因,最好创建使用 HttpClientHandler 提供的相同连接池的单独的 HttpClient 实例(假设这就是它的工作原理)。我担心的是,我不希望 HttpClient 创建一个连接池,然后每次都会将其释放。有很多帖子讨论了这对性能有何影响。我似乎找不到任何关于有效使用 HttpClient 和 HttpClientHandlers 的好的文档。
所以...我的问题基本上是:
当一起使用 HttpClient 和 HttpClientHandler 时,是否最好将 HttpClientHandler 设为单例,然后using每次在块中实例化尽可能多的新 HttpClient?-- 这又只有当连接池由 HttpClientHandler 管理时才有意义,我认为就是这种情况。
使用HttpClientHandler,我们可以设置服务器验证回调并返回 true(通过写出或使用DangerousAcceptAnyServerCertificateValidator)。在升级到 .NET Core 2.2 后切换HttpClient到使用时,如何确保也绕过此验证SocketsHttpHandler?这是默认值吗?我目前找不到关于此主题的太多信息,我将部署到我希望避免进行重大更改的环境中。