2009-11-24 74 views
0

我正在開發具有一個Web服務器和一個C#客戶端哪些職位XML的Web服務器的應用程序。 Web服務器需要知道客戶端的本地IP地址。我嘗試了在服務器端檢索IP地址的方法,但這些方法在代理服務器或NAT之間沒有給出客戶端的IP地址。所以我需要在客戶端應用程序中找到連接的本地IP,並將其發送給請求。發送帶有HttpWebRequest的(C#)相關聯的連接的本地IP地址

問題出在HttpWebRequest。我沒有看到任何方法可以在發送HTTP請求時獲取連接的本地IP地址。

澄清:
客戶在我的情況是不是基於瀏覽器。這是一個C#應用程序。我的服務器具有基於本地IP的特定規則,用於在發送HTTP請求時連接到服務器。就我而言,本地IP是固定的。在本地計算機上可能有多個IP--這就是爲什麼我要將與Socket關聯的本地IP用於發送請求的原因。如果我在C#中使用TcpClient並在其上實現HTTP協議,可以解決這個問題,但我想避免這種情況。那麼,在發佈請求之前,有什麼方法可以獲得與HttpWebRequest關聯的套接字嗎?

+1

要添加到CodeByMoonlights答案,這將是不可靠的,什麼讓你認爲客戶端只有1個IP地址? 事實上,NATs *可能會出現這種情況,這表明這不是一個內聯網場景,我想。所以也許退後一步,告訴我們你正試圖解決的問題,而不是你已經設計的解決方案的問題。 – 2009-11-24 08:20:14

回答

0

這樣做沒有保證。 Javascript和服務器端代碼只能看到公共地址,而不是本地的。有一種使用Java獲得它的方法(提到here),但它依賴於Javascript和Java可用,以及支持該特定調用的用戶瀏覽器。

鑑於許多本地IP是根據需要分配的(我的家用PC是使用DHCP分配的,我的工作PC也發生了變化),您是否認爲知道本地IP實際上會有用?

1

這是不可能得到的是HttpWebRequest的是要使用的連接的本地ip地址。但是,您可以使用Dns或System.Net.NetworkInformation類來獲取所有本地IP地址,並將它們作爲自定義標題發送給您的請求。在服務器端,你可以解析這個頭文件,並查看是否有任何IP匹配你所期望的。

然而,隨着達米安已經如上所述,該解決方案是不是萬無一失的,人們可以欺騙名稱IP地址到一個服務器期待。也許你需要退後一步,想一想你想通過這種方式達到什麼樣的安全性?看看你是否可以通過不同的方法實現你的目標 - 例如:用戶使用受支持的方法(如基本(通過HTTPS),摘要,NTLM,Kerberos,協商或使用客戶端證書使用SSL進行身份驗證?

0

也許你應該從HttpWebRequest的,如果XML是你送什麼過線移動到SOAP請求/響應。實現ASPX Web服務或WFC Web服務。 HttpWebRequest對於服務器來說始終是可見的,因爲它們來自發布它們的最後一個IP,所以這將是NAT或代理服務器。

不過,我也覺得很奇怪,以至於你需要知道服務器端的本地計算機的IP。

0

一個可能的解決方案是告訴客戶端在連接到服務器時應該使用哪個ip,並將該ip包含在自定義標頭中供服務器讀取。

var srcip = IPAddress.Parse("10.0.0.1"); 
var request = (HttpWebRequest)HttpWebRequest.Create ("http://example.com/"); 
request.Headers.Add("X-Original-Client-IP", srcip.ToString()); 
request.ServicePoint.BindIPEndPointDelegate = delegate { return new IPEndPoint(srcip, 0); }; 
request.GetResponse();