2014-10-07 45 views
0

我想爲我需要的某些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客戶端?


這裏有更多的背景說明爲什麼我試圖做到這一點,以防有人有不同的解決方案在一起。我們有一個擁有多臺機器的網絡農場,每臺機器都使用一個具有多個IP地址的網卡(全部位於同一網關)。我們希望每個應用程序都使用它自己的IP地址作爲外部請求。

下面是一個簡化的版本:

  1. 機1
    1. 應用1(10.0.1.10/255.255.0.0)
    2. 應用2(10.0.1.11/255.255.0.0)
    3. 等。
  2. 機2
    1. 應用1(10.0.2.10/255.255.0.0)
    2. 應用2(10.0.2.11/255.255.0.0)
    3. 等...
  3. 等...

流量從172.16.0.2(應用1外部)路由到10.0.x.10(應用1內部),從172.16.0.3(應用2外部)到10.0.x.11(應用2內部)等等。我們是試圖通過使用172.16.0.2(app 1 external)來避免來自app 2的外部請求,因爲它使用10.0.x.10作爲本地地址而不是10.0.x.11。簡化的例子

快速的網絡圖,在情況下幫助所有: example network diagram

+0

你的問題不太清楚。您正在向某個網址發送HTTP請求 - 該網址中已經有了該IP地址。我不太清楚服務器和客戶應該在哪裏。另外,你怎麼能有一個單一的網卡有很多不同的IP地址? – Luaan 2014-10-07 13:38:49

+0

這是目標IP地址。我正在嘗試更改源IP地址。您可以在NIC的高級TCP/IP設置中添加更多IP地址。 – 2014-10-07 13:47:12

+0

我100%確定我有多個IP地址。這裏有一個問題,解釋如何你可以做到這一點,如果你有興趣:http://serverfault.com/questions/868/multiple-ip-addresses-per-nic – 2014-10-07 14:03:27

回答

1

HttpClient不允許你這樣做。但是,HttpWebRequest呢!

A 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的端口號是因爲每個客戶端套接字都需要有一個唯一的端口號。

你可能會很好地研究這個更好的正確使用,我敢肯定,這是比那個接口的設計者更骯髒。但它應該指向正確的方向。

+0

謝謝! ServicePoint.BindIPEndPointDelegate看起來正是我需要的工作。 – 2014-10-07 16:14:22

+1

您可以使用端口號「0」,這將自動選擇一個空閒的本地端口。 – 2016-08-16 19:08:03

相關問題