如何通过HTTPRequest, 得到客户请求的IP地址,本身并不是一个复杂的问题。但是由于代理、NAT、路由转换等,导致系统变得复杂。目前可用的解决方法为:
public static class WebRequestHelper
{
public static string GetUserAgent()
{
return HttpContext.Current.Request.UserAgent;
}
public static string GetIpAddress()
{
var result = string.IsNullOrEmpty(HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"])
? HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
: HttpContext.Current.Request.ServerVariables["HTTP_X_REAL_IP"];
if (!string.IsNullOrEmpty(result))
{
//可能有代理
if (result.IndexOf(".", StringComparison.Ordinal) == -1) //没有“.”肯定是非IPv4格式
result = null;
else
{
if (result.IndexOf(",", StringComparison.Ordinal) != -1)
{
//有“,”,估计多个代理。取第一个不是内网的IP。
result = result.Replace(" ", "").Replace("'", "");
var tempIp = result.Split(",;".ToCharArray());
foreach (var ip in tempIp)
{
if (IsIpAddress(ip) && !ip.StartsWith("10.") && !ip.StartsWith("192.168") && !ip.StartsWith("172.16."))
{
return ip;
}
}
}
else if (IsIpAddress(result))
{
return result;
}
else
{
result = null;
}
}
}
if (string.IsNullOrEmpty(result))
{
result = HttpContext.Current.Request.ServerVariables["HTTP_X_REAL_IP"];
}
if (string.IsNullOrEmpty(result))
{
result = HttpContext.Current.Request.UserHostAddress;
}
return result;
}
private static bool IsIpAddress(string str1)
{
if (string.IsNullOrEmpty(str1) || str1.Length < 7 || str1.Length > 15)
{
return false;
}
const string regFormat = @"^d{1,3}[.]d{1,3}[.]d{1,3}[.]d{1,3}$";
var regex = new Regex(regFormat, RegexOptions.IgnoreCase);
return regex.IsMatch(str1);
}
}