从 HttpClient 实例访问 HttpClientHandler?
Posted
技术标签:
【中文标题】从 HttpClient 实例访问 HttpClientHandler?【英文标题】:Access HttpClientHandler from HttpClient instance? 【发布时间】:2020-07-20 16:25:35 【问题描述】:当使用 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");
【问题讨论】:
var handler = client.GetType().BaseType.GetField("handler", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(client) as HttpClientHandler;
感谢 Jimi,这正是我想要实现的目标 - 很享受!也为未来学到了一些东西!
【参考方案1】:
让我重新编辑我的答案。使用构造函数
public class MyClass
private readonly HttpClientHander _handler;
private readonly HttpClient _client;
public MyClass()
_handler = new HttpClientHander() /* Initialize the properties */
_client = new HttpClient(_handler);
public void MyMethod()
if (_handler.TheProperty == true;) // Do something
我希望这是有道理的。由于引用对象的方式,我确信它可以工作。
【讨论】:
不幸的是我不能这样做,我们不能修改将 HttpClient 实例作为参数传递给我们的类的客户端。我们只能在我们的方法 DoSomething(HttpClient client) ... 中使用传递的实例 我已经重新编辑了我的答案,试试看它是否有效 感谢您的建议,如果我们可以对这个程度进行更改,这将起作用,但不幸的是,我们现在不能。 Jimi 的建议适用于我们当前的场景,因为它允许我们保持一切不变,只需通过参数传入的 HttpClient 实例访问处理程序。再次感谢!以上是关于从 HttpClient 实例访问 HttpClientHandler?的主要内容,如果未能解决你的问题,请参考以下文章