为HTTP请求指定本地端点的最佳方法?

时间:2014-10-07 13:28:52

标签: .net sockets http

我正在尝试为我需要做的某些HTTP请求指定本地端点。

以下是我现在正在做的简化版本:

using (HttpClient client = new HttpClient())
  using (HttpResponseMessage response = await client.SendAsync(request))
    if (response.IsSuccessStatusCode)
      result = await response.Content.ReadAsStringAsync();

我与System.Net.Http.HttpClient无关,我完全愿意使用其他课程,例如System.Net.HttpWebRequest来完成工作。

至少在理论上看起来可能是因为Windows和System.Net.Sockets允许使用Bind方法。 Source IP address selection on a Multi-Homed Windows ComputerMSDN - Socket Class (System.Net.Sockets)

显然这是不可能的,但在理想的世界中,我可以以某种方式访问​​底层的Socket:

client.Socket.Bind(new IPEndPoint(167772161, 80));

如果不编写整个HTTP客户端,有没有办法做到这一点?


以下是关于我为什么要这样做的更多背景知识,以防某人有一个不同的解决方案。我们有一个webfarm,其中包含多台计算机,每台计算机使用一个具有多个IP地址的NIC(全部位于同一网关上)。我们希望每个应用程序都使用自己的IP地址来进行外部请求。

这是一个简化版本:

  1. 机器1
    1. App 1(10.0.1.10 / 255.255.0.0)
    2. App 2(10.0.1.11 / 255.255.0.0)
    3. 等。
  2. 机器2
    1. App 1(10.0.2.10 / 255.255.0.0)
    2. App 2(10.0.2.11 / 255.255.0.0)
    3. 等...
  3. 等...
  4. 流量从172.16.0.2(app 1 external)路由到10.0.x.10(app 1 internal),从172.16.0.3(app 2 external)到10.0.x.11(app 2 internal)等。我们正在尝试使用172.16.0.2(app 1 external)避免来自应用2的外部请求,因为它使用10.0.x.10作为本地地址而不是10.0.x.11。

    简化示例的快速网络图,如有帮助: example network diagram

1 个答案:

答案 0 :(得分:1)

HttpClient不允许您这样做。但是,HttpWebRequest会这样做!

HttpWebRequest可以与管理HTTP连接的ServicePoint对象关联。这允许您传递自己的IPEndPoint。一个简单的例子:

var req = HttpWebRequest.CreateHttp("http://www.google.com/");

req.ServicePoint.BindIPEndPointDelegate = 
  (s, ep, retries) => 
    new IPEndPoint(IPAddress.Parse("10.0.1.10"), 1234 + retries);

var response = req.GetResponse();

请注意,端口不是 80 - 我将retries添加到端口号的原因是因为每个客户端套接字都需要具有唯一性端口号。

你可能会更好地研究这个的正确使用方法,我很确定这比那个界面的设计者要肮脏得多。但它应该指出你正确的方向。