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

如何使用HttpClient从特定IP地址发送请求?C#,c#,asp.net-web-api2,dotnet-httpclient,C#,Asp.net Web Api2,Dotnet Httpclient,我在服务器上有多个IP,希望在使用HttpClient类从API获取/发布数据时选择要使用的IP之一。 (甚至可以同时发送请求,但使用2个IP,而不仅仅是一个) 我见过一些使用HttpWebRequest()的示例,它使用委托,但我想继续使用HttpClient实现。[这将是一个黑客代码,因为没有访问ServicePoint的方法/属性] 您可以使用反射访问底层ServicePoint,如下所示 (由于没有公共/私有字段/属性访问此值,因此我将钩住startRequest委托) 只是想更新一下,

我在服务器上有多个IP,希望在使用HttpClient类从API获取/发布数据时选择要使用的IP之一。 (甚至可以同时发送请求,但使用2个IP,而不仅仅是一个)


我见过一些使用HttpWebRequest()的示例,它使用委托,但我想继续使用HttpClient实现。

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

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


只是想更新一下,对于任何使用此代码的人,不要像我一样被抓。首先,事实上.net核心团队已经实现了HttpClientHandler等,而没有费心将任何与服务点相关的东西放在其中,因此您将编写所有代码,发现它在静默状态下没有任何作用,更不用说本例中的这段代码了,而valid将中断。同样说到这段代码,主要的警告是---第一个字段名不正确,应该是_startRequest,否则你会得到null ref错误&使用完整的框架而不是核心。
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;
}
HttpClientHandler handler = SetServicePointOptions(new HttpClientHandler());
HttpClient client = new HttpClient(handler);
var str = await client.GetStringAsync("https://google.com");