如何使用HttpClient从特定IP地址发送请求?C#

met*_*ase 4 c# dotnet-httpclient asp.net-web-api2

我的服务器上有多个 IP,并且想在使用 HttpClient 类从 API 获取/发布数据时选择使用其中一个。(或者甚至同时发送请求,但使用 2 个 IP,而不仅仅是一个)

我已经看到一些使用 HttpWebRequest (此处)的示例,这些示例利用委托,但我想继续使用 HttpClient 实现。

L.B*_*L.B 6

[这将是一个 hacky 代码,因为没有方法/属性来访问ServicePoint ]

您可以使用反射来访问底层ServicePoint,如下所示(由于没有公共/私有字段/属性来访问该值,所以我将挂钩startRequest委托)

HttpClientHandler SetServicePointOptions(HttpClientHandler handler)
{
    var field = handler.GetType().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 = new BindIPEndPoint(BindIPEndPointCallback);

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

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

    return handler;
}
Run Code Online (Sandbox Code Playgroud)

BindIPEndPointCallback是您在问题中链接的那个。根据您的意愿修改它。现在你可以像这样使用这个方法

HttpClientHandler handler = SetServicePointOptions(new HttpClientHandler());
HttpClient client = new HttpClient(handler);
var str = await client.GetStringAsync("https://google.com");
Run Code Online (Sandbox Code Playgroud)

  • 只是对此进行更新,对于使用此代码的任何人,不要像我一样被抓住。首先,.net core 团队已经实现了 HttpClientHandler 等,而无需费心将与服务点相关的任何内容放在那里,因此您将编写所有代码,发现它默默地什么都不做,更不用说这个示例中的代码了有效就会中断。另外,谈到这段代码时,主要警告 --- 第一个字段名称不正确,它应该是 _startRequest,否则您将得到 null ref 错误并使用完整的框架而不是核心。 (3认同)