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

4

我在服务器上有多个IP,想要在使用HttpClient类从API获取/发布数据时选择其中一个IP(甚至同时使用2个IP而不是只用一个IP发送请求)。

我看到一些使用HttpWebRequest的示例(这里),它利用委托,但我仍然想继续使用HttpClient实现。

1个回答

6

[这将是一段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");

3
仅作更新说明,对于使用此代码的任何人,请不要像我一样被抓住。首先,.NET Core团队已经实现了HttpClientHandler等内容,但没有放置任何与服务点相关的内容,因此您将编写所有代码以发现它静默地未执行任何操作,更不用说此示例中的代码虽然有效,但是会出错。此外,谈到此代码的主要警告——第一个字段名称不正确,应为_startRequest,否则您将获得空引用错误,并且使用完整框架而不是核心。 - Jaddie
非常感谢您的评论。我遇到了完全相同的问题,即在 .net fx 上设置 servicePoint.bindIpEndPointDelegate 是有效的,但在 .net core 上却无效!最终我不得不将我的代码切换到 .net fx。 - Pilgerstorfer Franz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接