从 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?的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient

云信 短信发送 demo

接口自动化HttpClient-基础篇1

关于java httpclient编程的问题

JAVA发送HttpClient

Fiddler 抓取 Java HttpClient发送的请求