繁体   English   中英

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

[英]How to use HttpClient to send a Request from a specific IP address? C#

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

我已经看到了一些使用HttpWebRequest的示例( 在这里 ),该示例利用了委托,但是我想继续使用HttpClient实现。

[这将是骇客代码,因为没有访问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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM