0
我在服务器上有多个IP,并且想要选择使用HttpClient类从API获取/发布数据时要使用哪一个IP。 (或者甚至发送的同时请求,但利用2个IP地址而不是一个)使用的HttpWebRequest如何使用HttpClient从特定IP地址发送请求? C#
我见过一些例子(here)利用委托,但我想继续使用HttpClient的执行情况。
我在服务器上有多个IP,并且想要选择使用HttpClient类从API获取/发布数据时要使用哪一个IP。 (或者甚至发送的同时请求,但利用2个IP地址而不是一个)使用的HttpWebRequest如何使用HttpClient从特定IP地址发送请求? C#
我见过一些例子(here)利用委托,但我想继续使用HttpClient的执行情况。
[这将是一个哈克码,因为没有方法/属性来访问的ServicePoint]
可以使用反射来访问底层的ServicePoint如下 (由于没有公共/私有字段/属性来访问这个值,我会勾startRequest代表)
HttpClientHandler SetServicePointOptions(HttpClientHandler handler)
{
var field = handler.GetType().GetField("startRequest", BindingFlags.NonPublic| BindingFlags.Instance);
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");