asp.net中获得客户端的IP地址

本文介绍如何从HTTP请求中解析客户端浏览器信息和IP地址,包括使用正则表达式匹配IP地址,以及通过多种HTTP头获取IP地址的方法。
static Regex validipregex = new Regex(@"([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})+", RegexOptions.Compiled);

public static string GetClientBrowserInfo()
{
	string info = "";

	if (HttpContext.Current != null)
	{
		NameValueCollection headers = HttpContext.Current.Request.Headers;
		if (headers != null && headers.Count > 0)
		{
			info = "BROWSER[";
			foreach (string header in headers)
			{
				foreach (string headervalue in headers.GetValues(header))
				{
					info += string.Format("{0}:{1};", header, headervalue);
				}
			}
			info += "]";
		}
	}

	return info;
}

public static IEnumerable<string> GetClientIPs2()
{
	string strContent = GetClientBrowserInfo();
	List<string> ips = new List<string>(10);
	if (!string.IsNullOrEmpty(strContent))
	{
		MatchCollection mc = validipregex.Matches(strContent);
		IPAddress addr;
		for (int j = 0; j < mc.Count; j++)
		{
			string ipAddr = mc[j].Value;
			if (IPAddress.TryParse(ipAddr, out addr) && addr.AddressFamily == AddressFamily.InterNetwork)
			{
				ips.Add(ipAddr);
			}
		}
	}
	return ips.Distinct().ToList();
}
public static string GetClientIP2()
{
	var svs = HttpContext.Current?.Request?.ServerVariables;
	string ip = string.Empty;

	if (svs == null)
	{
		return ip;
	}
	if ((ip = svs.Get("HTTP_X_FORWARDED_FOR").GetValidIp()) != null)
	{
		return ip;
	}
	if ((ip = svs.Get("HTTP_X_REAL_IP").GetValidIp()) != null)
	{
		return ip;
	}
	if ((ip = svs.Get("REMOTE_ADDR").GetValidIp()) != null)
	{
		return ip;
	}
	if ((ip = HttpContext.Current?.Request?.UserHostAddress.GetValidIp()) != null) {
		return ip;
	}
	return string.Empty;
}

private static string GetValidIp(this string ips)
{
	if (string.IsNullOrWhiteSpace(ips))
	{
		return null;
	}

	var group = ips.Split(',').Select(ip => ip.Trim());
	IPAddress ipAddr;
	foreach (string ip in group)
	{
		if (IPAddress.TryParse(ip, out ipAddr) )
		{
			if (ip.Contains(":"))
			{
				ipAddr = ipAddr.MapToIPv4();
			}
			if (ipAddr.AddressFamily == AddressFamily.InterNetwork) {
				return ipAddr.ToString();
			}                  
		}
	}
	return null;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值