【问题标题】:Access HttpClientHandler from HttpClient instance?从 HttpClient 实例访问 HttpClientHandler?
【发布时间】: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,这正是我想要实现的目标 - 很享受!也为未来学到了一些东西!

标签: c# .net httpclient httpclienthandler


【解决方案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 实例访问处理程序。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
相关资源
最近更新 更多