2010-04-19 222 views
3

請讓我知道如何獲取客戶端IP地址,ip地址

我已經嘗試了所有的東西下面,但我得到了相同的輸出:127.0.0.1

string strClientIP; 
strClientIP = Request.UserHostAddress.ToString(); 

string strHostName = System.Net.Dns.GetHostName(); 
string clientIPAddress = System.Net.Dns.GetHostAddresses(strHostName).GetValue(0).ToString(); 

string ipaddress = string.Empty ; 
ipaddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
if (ipaddress == "" || ipaddress == null) 
    ipaddress = Request.ServerVariables["REMOTE_ADDR"]; 

如何獲得正確的IP?

+1

http://stackoverflow.com/questions/2612591/i-am-getting-the-wrong-client-ip-address – 2010-04-19 19:12:16

+0

的可能重複我有同樣的問題。我解決了這個博客文章:[如何使用ASP.net獲取客戶端系統的IP地址](http://dotnetstock.com/technical/how-to-get-ip-address-of-a-client- system-using-asp-net) – 2012-11-11 10:26:13

回答

4

你是正確的軌道上REMOTE_ADDR,但如果你是在本地訪問的網站可能無法正常工作,它會顯示本地主機。

REMOTE_ADDR是包含客戶端的IP地址,你應該首先檢查頭部。

您也應該檢查爲以防HTTP_X_FORWARDED頭你訪問者是通過代理。請注意0​​是一個數組,它可以包含多個逗號分隔值,具體取決於代理的數量。

這裏是一個小的C#代碼片段,顯示確定客戶端的IP:

string clientIp = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
if(!string.IsNullOrEmpty(clientIp)) { 
    string[] forwardedIps = clientIp.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 
    clientIp = forwardedIps[forwardedIps.Length - 1]; 
} else { 
    clientIp = context.Request.ServerVariables["REMOTE_ADDR"]; 
} 
+0

另外請注意,System.Net.Dns.GetHostName將獲得您正在運行的本地計算機的地址! – vfilby 2010-04-19 19:05:28

+0

這是否意味着在部署到服務器之後,此代碼能夠正常工作? string ipaddress = string.Empty; ipaddress = Request.ServerVariables [「HTTP_X_FORWARDED_FOR」]; if(ipaddress ==「」|| ipaddress == null) ipaddress = Request.ServerVariables [「REMOTE_ADDR」]; – Zerotoinfinity 2010-04-19 20:02:39

+0

不一定,HTTP_X_FORWARDED_FOR可以是一個IP地址或一個IP地址數組,您可能需要考慮這一點。否則,我認爲它應該可以工作,您可以隨時嘗試通過IIS在本地機器上暴露代碼,然後通過另一臺計算機連接以查看它報告的IP。你可能還想考慮'String.IsNullOrEmpty(...)'而不是'(ipaddr =「」|| ipaddr == null')。 – vfilby 2010-04-20 13:46:02

1

如果你通過本地主機地址進行連接,那麼你的客戶端地址也將報告爲本地主機(因爲它會通過環回適配器路線)