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

时间:2016-09-25 17:41:58

标签: c# asp.net-web-api2 dotnet-httpclient

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

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

1 个答案:

答案 0 :(得分:1)

[这将是一个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;
}

BindIPEndPointCallback 是你问题中linked的那个。根据需要修改它。 现在您可以使用此方法,如

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