控制器代码如下:
public static class UrlIP
{
# region Ip ( 客户端IP地址)
public static string Ip ( System. Web. HttpRequestBase request)
{
var result = string . Empty;
if ( request != null )
{
result = GetWebClientIp ( request) ;
}
if ( string . IsNullOrWhiteSpace ( result) )
{
result = GetLanIp ( ) ;
}
return result;
}
private static string GetWebClientIp ( System. Web. HttpRequestBase request)
{
var ip = GetWebProxyRealIp ( request) ?? GetWebRemoteIp ( request) ;
foreach ( var hostAddress in Dns. GetHostAddresses ( ip) )
{
if ( hostAddress. AddressFamily == System. Net. Sockets. AddressFamily. InterNetwork)
{
return hostAddress. ToString ( ) ;
}
}
return string . Empty;
}
private static string GetWebRemoteIp ( System. Web. HttpRequestBase request)
{
try
{
return request. ServerVariables[ "HTTP_X_FORWARDED_FOR" ] ??
request. ServerVariables[ "REMOTE_ADDR" ] ?? "" ;
}
catch
{
return string . Empty;
}
}
private static string GetWebProxyRealIp ( System. Web. HttpRequestBase request)
{
string ip = request. Headers. Get ( "x-forwarded-for" ) ;
if ( string . IsNullOrEmpty ( ip) || string . Equals ( "unknown" , ip, StringComparison. OrdinalIgnoreCase) )
{
ip = request. Headers. Get ( "Proxy-Client-IP" ) ;
}
if ( string . IsNullOrEmpty ( ip) || string . Equals ( "unknown" , ip, StringComparison. OrdinalIgnoreCase) )
{
ip = request. Headers. Get ( "WL-Proxy-Client-IP" ) ;
}
if ( string . IsNullOrEmpty ( ip) || string . Equals ( "unknown" , ip, StringComparison. OrdinalIgnoreCase) )
{
ip = request. UserHostAddress;
}
if ( string . IsNullOrEmpty ( ip) )
{
return string . Empty;
}
if ( ip. Contains ( ", " ) )
{
string [ ] ips = ip. Split ( new string [ 1 ] { ", " } , StringSplitOptions. RemoveEmptyEntries) ;
var i = 0 ;
for ( i = 0 ; i < ips. Length; i++ )
{
if ( ips[ i] != "" )
{
if ( false == IsInnerIp ( ips[ i] ) )
{
IPAddress realIp;
if ( IPAddress. TryParse ( ips[ i] , out realIp) && ips[ i] . Split ( '.' ) . Length == 4 )
{
return ips[ i] ;
}
return "" ;
}
}
}
ip = ips[ 0 ] ;
}
return ip;
}
private static bool IsInnerIp ( string ip)
{
bool isInnerIp = false ;
ulong ipNum = Ip2Ulong ( ip) ;
ulong aBegin = Ip2Ulong ( "10.0.0.0" ) ;
ulong aEnd = Ip2Ulong ( "10.255.255.255" ) ;
ulong bBegin = Ip2Ulong ( "172.16.0.0" ) ;
ulong bEnd = Ip2Ulong ( "10.31.255.255" ) ;
ulong cBegin = Ip2Ulong ( "192.168.0.0" ) ;
ulong cEnd = Ip2Ulong ( "192.168.255.255" ) ;
isInnerIp = IsInner ( ipNum, aBegin, aEnd) || IsInner ( ipNum, bBegin, bEnd) || IsInner ( ipNum, cBegin, cEnd) ||
ip. Equals ( "127.0.0.1" ) ;
return isInnerIp;
}
private static ulong Ip2Ulong ( string ip)
{
byte [ ] bytes = IPAddress. Parse ( ip) . GetAddressBytes ( ) ;
ulong ret = 0 ;
foreach ( var b in bytes)
{
ret <<= 8 ;
ret |= b;
}
return ret;
}
private static bool IsInner ( ulong userIp, ulong begin, ulong end)
{
return ( userIp >= begin) && ( userIp <= end) ;
}
private static string GetLanIp ( )
{
foreach ( var hostAddress in Dns. GetHostAddresses ( Dns. GetHostName ( ) ) )
{
if ( hostAddress. AddressFamily == System. Net. Sockets. AddressFamily. InterNetwork)
{
return hostAddress. ToString ( ) ;
}
}
return string . Empty;
}
#endregion
}
调用
string Ip = UrlIP. Ip ( Request) ;