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");