我在服务器上有多个IP,想要在使用HttpClient类从API获取/发布数据时选择其中一个IP(甚至同时使用2个IP而不是只用一个IP发送请求)。
我看到一些使用HttpWebRequest的示例(这里),它利用委托,但我仍然想继续使用HttpClient实现。
我在服务器上有多个IP,想要在使用HttpClient类从API获取/发布数据时选择其中一个IP(甚至同时使用2个IP而不是只用一个IP发送请求)。
我看到一些使用HttpWebRequest的示例(这里),它利用委托,但我仍然想继续使用HttpClient实现。
[这将是一段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是你在问题中链接的方法。按照你的意愿修改它。 现在你可以像这样使用这个方法:
HttpClientHandler handler = SetServicePointOptions(new HttpClientHandler());
HttpClient client = new HttpClient(handler);
var str = await client.GetStringAsync("https://google.com");