2010-04-12 170 views

回答

20

HttpContext.Current.Request.UserHostAddress;

HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

+3

有什麼不同在兩個第一替代方案之間呢? – 2011-02-08 13:56:52

2

Request.UserHostAddress

25

編輯:也發現了一個關於IP相關的http頭文件here的有趣問題。

編輯2:正如評論和我在上面提供的鏈接中所述,HTTP_X_FORWARDED_FOR標頭可能包含多個由逗號分隔的IP地址。我沒有面對這種情況,但假設我的答案需要一些更正。

我用這個代碼來獲取IP地址(它返回IPAddress.None值,如果得到某種原因失敗):

/// <summary> 
    /// Gets the IP address of the request. 
    /// <remarks> 
    /// This method is more useful than built in because in some cases it may show real user IP address even under proxy. 
    /// <summary> 
    /// Gets the IP address of the request. 
    /// <remarks> 
    /// This method is more useful than built in because in some cases it may show real user IP address even under proxy. 
    /// The <see cref="System.Net.IPAddress.None" /> value will be returned if getting is failed. 
    /// </remarks> 
    /// </summary> 
    /// <param name="request">The HTTP request object.</param> 
    /// <returns></returns> 
    public static IPAddress GetIp(this HttpRequest request) 
    { 
     string ipString; 
     if (string.IsNullOrEmpty(request.ServerVariables["HTTP_X_FORWARDED_FOR"])) 
     { 
      ipString = request.ServerVariables["REMOTE_ADDR"]; 
     } 
     else 
     { 
      ipString = request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) 
       .FirstOrDefault(); 
     } 

     IPAddress result; 
     if (!IPAddress.TryParse(ipString, out result)) 
     { 
      result = IPAddress.None; 
     } 

     return result; 
    } 
+7

+1作爲IPAddress對象返回 – 2010-04-12 09:29:44

+4

請注意,「X-Forwarded-For」標頭可以僞造,因此不要根據它做出任何安全決定。如果機器位於負載平衡器或逆向代理之後,請僅檢查「HTTP_X_FORWARDED_FOR」值。 – devstuff 2010-04-12 09:45:51

+2

另請注意,如果傳遞多個代理,HTTP_X_FORWARDED_FOR將包含多個IP地址。 The Parse方法是否可以正確處理這個問題? – Tomas 2010-04-12 10:42:36

1
public String GetIP() 
{ 
    string ipString; 
    if (string.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"])) 
    { 
     ipString = Request.ServerVariables["REMOTE_ADDR"]; 
    } 
    else 
    { 
     ipString = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); 
    } 
    return ipString; 
} 

首先試圖找出代理IP,如果它的空,我們可以得到該系統的IP

0

嘗試使用此方法獲得的用戶外部IP地址..

public static string getExternalIp() 
    { 
     try 
     { 

      string externalIP; 
      externalIP = (new WebClient()).DownloadString("http://checkip.dyndns.org/"); 
      externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) 
         .Matches(externalIP)[0].ToString(); 
      return externalIP; 
     } 
     catch { return null; } 
    }