2010-04-12 164 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; } 
    }