哇,糾結了好幾天,爲了獲取客戶端IP地址,因爲IPv6的出現好多問題,經常會碰到一些問題。
如:獲取不到IP,有時候獲取到 了卻是IPv6的,你又未曾看到過,好吧,貼下代碼
/// <summary>
/// 取得客戶端主機地址
/// </summary>
public static string GetClientIP()
{
if (null != HttpContext.Current.Request.ServerVariables["HTTP_VIA"])
{
return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
}
else
{
return HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
}
/// <summary>
/// 取得客戶端主機IPv4 地址
/// </summary>
/// <returns></returns>
public static string GetClientIPv4()
{
string ipv4 = String.Empty;
foreach (IPAddress ip in Dns.GetHostAddresses(GetClientIP()))
{
if (ip.AddressFamily.ToString() == "InterNetwork")
{
ipv4 = ip.ToString();
break;
}
}
if (ipv4 != String.Empty)
{
return ipv4;
}
// 原代碼使用 Dns.GetHostName 方法取回的是 Server 端資料,非 Client 端。
// 改爲利用 Dns.GetHostEntry 方法,由獲取的 IPv6 位址反查 DNS 記錄,
// 再逐一判斷是否屬於 IPv4 協議定,如果是轉換爲 IPv4 地址。
foreach (IPAddress ip in Dns.GetHostEntry(GetClientIP()).AddressList)
//foreach (IPAddress ip in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (ip.AddressFamily.ToString() == "InterNetwork")
{
ipv4 = ip.ToString();
break;
}
}
return ipv4;
}