【问题标题】:How to get information (IP address) about connection from HttpClient如何从 HttpClient 获取有关连接的信息(IP 地址)
【发布时间】:2019-09-07 01:13:08
【问题描述】:

我的服务对其他服务进行外部调用。它有助于了解已建立连接的确切 IP 地址(以防需要跟进这些服务的所有者)。

我正在使用 HttpClient。有没有办法获取底层 IP 地址(反射很好)?

【问题讨论】:

  • 但是你已经连接到远程地址了,为什么不能使用呢?
  • HttpClient 包含一个连接池,它不会建立单个连接,而是根据需要创建连接。到同一服务的多个连接最终可能会使用不同的 IP 地址,具体取决于服务的提供方式,例如,如果有负载均衡器。
  • 您是否真的与“这些服务的所有者”核实过提供 IP 是否对他们有任何用处
  • 可以为 HttpWebRequest 做到这一点:stackoverflow.com/questions/55446711/…。我想知道是否有办法为 HttpClient 获取类似信息。

标签: c#


【解决方案1】:

灵感来自 thisthis 帖子。

可以通过反射访问底层ServicePoint并覆盖BindIPEndPoint:

private static void TryHttpClientWithServicePoint()
{
    var webRequestHandler = SetServicePointOptions(new WebRequestHandler());
    var client = new HttpClient(webRequestHandler);
    var content = client.GetStringAsync("https://stackoverflow.com").Result;
    Console.WriteLine(content.Substring(0, 256));
}

private static WebRequestHandler SetServicePointOptions(WebRequestHandler handler)
{
    var field = typeof(HttpClientHandler).GetField("_startRequest",
        BindingFlags.NonPublic | BindingFlags.Instance); // Fieldname has a _ due to being private
    var startRequest = (Action<object>) field.GetValue(handler);

    Action<object> newStartRequest = obj =>
    {
        var webReqField = obj.GetType().GetField("webRequest", BindingFlags.NonPublic | BindingFlags.Instance);
        var webRequest = webReqField.GetValue(obj) as HttpWebRequest;
        webRequest.ServicePoint.BindIPEndPointDelegate = BindIPEndPoint;

        startRequest(obj); //call original action
    };

    field.SetValue(handler, newStartRequest); //replace original 'startRequest' with the one above

    return handler;
}

public static IPEndPoint BindIPEndPoint(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount)
{
    Console.WriteLine($"IP address = {remoteEndPoint}");
    return null;
}

提供对远程 IP 的访问权限:

【讨论】:

    猜你喜欢
    • 2022-06-12
    • 1970-01-01
    • 2011-09-30
    • 2016-10-27
    • 2014-05-26
    • 1970-01-01
    • 2015-08-13
    • 2011-10-02
    • 2016-07-30
    相关资源
    最近更新 更多