ASP.NET获取客户端IP地址

Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正的客户端IP地址。

要想透过代理服务器取得客户端的真实IP地址,就要使用 Request.ServerVariables("HTTP_X_FORWARDED_FOR") 来读取。

不过要注意的事,并不是每个代理服务器都能用 Request.ServerVariables("HTTP_X_FORWARDED_FOR") 来读取客户端的真实 IP,有些用此方法读取到的仍然是代理服务器的IP。

还有一点需要注意的是:如果客户端没有通过代理服务器来访问,那么用 Request.ServerVariables ("HTTP_X_FORWARDED_FOR") 取到的值将是空的。因此,如果要在程序中使用此方法,可以这样处理: 
...... 
userip = Request.ServerVariables("HTTP_X_FORWARDED_FOR") 
If userip = "" Then userip = Request.ServerVariables("REMOTE_ADDR") 
......

 1 //方法一 
 2 HttpContext.Current.Request.UserHostAddress;
 3 
 4 //方法二 
 5 HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
 6 
 7 //方法三 
 8 string strHostName = System.Net.Dns.GetHostName(); 
 9 string clientIPAddress = System.Net.Dns.GetHostAddresses(strHostName).GetValue(0).ToString();
10 
11 //方法四(无视代理) 
12 HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
13 
14 
15 客户端:
16 
17 //方法五 
18 var ip = ' <!--#echo var="REMOTE_ADDR"-->'; 
19 alert("Your IP address is "+ip);
20 
21 //方法六(无视代理) 
22 function GetLocalIPAddress() 
23 { 
24     var obj = null; 
25     var rslt = ""; 
26     try 
27     { 
28         obj = new ActiveXObject("rcbdyctl.Setting"); 
29         rslt = obj.GetIPAddress; 
30         obj = null; 
31     } 
32     catch(e) 
33     { 
34         // 
35     } 
36     
37     return rslt; 
38 } 

来自印度的MCT Maulik Patel提供了一种服务端的解决方案,很好:

 1 if(Context.Request.ServerVariables["HTTP_VIA"]!=null) // 服务器, using proxy 
 2 { 
 3       得到真实的客户端地址 
 4     ip=Context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();  // Return real client IP. 
 5 } 
 6 else//如果没有使用代理服务器或者得不到客户端的ip  not using proxy or can't get the Client IP 
 7 { 
 8       
 9       //得到服务端的地址 
10     ip=Context.Request.ServerVariables["REMOTE_ADDR"].ToString(); //While it can't get the Client IP, it will return proxy IP. 
11 }