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

标签 c# asp.net-web-api2 dotnet-httpclient

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

我看过一些使用委托(delegate)的 HttpWebRequest ( here ) 的示例,但我想继续使用 HttpClient 实现。

最佳答案

[ 这将是一个 hacky 代码,因为没有方法/属性来访问 ServicePoint ]

您可以使用反射来访问底层 ServicePoint,如下所示 (由于没有公共(public)/私有(private)字段/属性来访问此值,我将 Hook startRequest 委托(delegate))

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 就是你 linked在你的问题中。根据需要修改它。 现在你可以像这样使用这个方法了

HttpClientHandler handler = SetServicePointOptions(new HttpClientHandler());
HttpClient client = new HttpClient(handler);
var str = await client.GetStringAsync("https://google.com");

关于c# - 如何使用 HttpClient 从特定 IP 地址发送请求? C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39689858/

相关文章:

c# - 在 .NET C# 中使用 httpclient 同时执行 http 请求

c# - 从 Azure 中托管的 Asp.net Core MVC Web 应用程序获取 "Response status code does not indicate success: 502 (Bad Gateway)"

c# - 如何识别带状线集合(轴)(序列化)中的带状线?

c# - 按位移位 - 在 C# 中获得与在 php 中不同的结果

c# - 如何将CLR转换成EXE

c# - ASP.NET Web API 模型绑定(bind) - 不同的参数名称

angularjs - WebAPI CORS 不允许 Post 请求

c# - 通过 HttpClient 的 HTTP Post 的 UrlEncode 非字符串属性

c# - 为什么必须添加 System.Data.Entity 才能使用 System.Data.Objects?

c# - WCF 代理在调用外部 API 后失败