如何在MVC中获取客户端IP地址
How to get client ip address in MVC
我想提取客户端PC的IP地址。我尝试了以下方法,但它总是 returns "::1"
1. var test = this.Request.ServerVariables.Get("REMOTE_ADDR");
2. request.UserHostAddress;
有任何输入吗?
您可以在您的 Controller
方法中像这样获取 I.P 地址:
如果客户端机器在代理服务器后面,我们可以检查变量 HTTP_X_FORWARDED_FOR
:
string ip;
ip = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(ip))
{
ip = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
如果在 HTTP_X_FORWARDED_FOR
服务器变量中找不到 IP 地址,则意味着它没有使用任何代理服务器,因此现在在 REMOTE_ADDR
服务器变量中检查 IP 地址。
注意:在您的本地计算机上,I.P 地址将显示为 ::1
,这是一个 IPV6 环回地址(即 localhost)。 IPV4 地址为 127.0.0.1
.
这是因为在这种情况下,客户端和服务器都是同一台机器。当应用程序部署在服务器上时,结果会有所不同。
下面的代码应该为您提供客户端 IP 地址的集合。如果没有,请 post 您的代码片段以便我们验证:
public static System.Collections.Generic.IReadOnlyCollection<System.Net.IPAddress> GetIpAddresses()
{
var ipAddresses = new List<System.Net.IPAddress>();
foreach (var values in GetValues(System.Web.HttpContext.Current.Request.Headers, "X-Forwarded-For"))
{
foreach (var ipv in values.Split(new char[] { ',', ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries))
{
if (ipv.Contains(":"))
{
var array = ipv.Split(':');
ipAddresses.Add(array.Length == 2 ? System.Net.IPAddress.Parse(array[0].Trim()) : System.Net.IPAddress.Parse(ipv.Trim()));
}
else
{
ipAddresses.Add(System.Net.IPAddress.Parse(ipv));
}
}
}
if (request.UserHostAddress != null)
{
if (request.UserHostAddress.Contains(":"))
{
var array = request.UserHostAddress.Split(':');
ipAddresses.Add(array.Length == 2 ? System.Net.IPAddress.Parse(array[0].Trim()) : System.Net.IPAddress.Parse(request.UserHostAddress.Trim()));
}
else
{
ipAddresses.Add(System.Net.IPAddress.Parse(request.UserHostAddress));
}
}
return ipAddresses;
}
我想提取客户端PC的IP地址。我尝试了以下方法,但它总是 returns "::1"
1. var test = this.Request.ServerVariables.Get("REMOTE_ADDR");
2. request.UserHostAddress;
有任何输入吗?
您可以在您的 Controller
方法中像这样获取 I.P 地址:
如果客户端机器在代理服务器后面,我们可以检查变量 HTTP_X_FORWARDED_FOR
:
string ip;
ip = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (string.IsNullOrEmpty(ip))
{
ip = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
如果在 HTTP_X_FORWARDED_FOR
服务器变量中找不到 IP 地址,则意味着它没有使用任何代理服务器,因此现在在 REMOTE_ADDR
服务器变量中检查 IP 地址。
注意:在您的本地计算机上,I.P 地址将显示为 ::1
,这是一个 IPV6 环回地址(即 localhost)。 IPV4 地址为 127.0.0.1
.
这是因为在这种情况下,客户端和服务器都是同一台机器。当应用程序部署在服务器上时,结果会有所不同。
下面的代码应该为您提供客户端 IP 地址的集合。如果没有,请 post 您的代码片段以便我们验证:
public static System.Collections.Generic.IReadOnlyCollection<System.Net.IPAddress> GetIpAddresses()
{
var ipAddresses = new List<System.Net.IPAddress>();
foreach (var values in GetValues(System.Web.HttpContext.Current.Request.Headers, "X-Forwarded-For"))
{
foreach (var ipv in values.Split(new char[] { ',', ' ', '\t', '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries))
{
if (ipv.Contains(":"))
{
var array = ipv.Split(':');
ipAddresses.Add(array.Length == 2 ? System.Net.IPAddress.Parse(array[0].Trim()) : System.Net.IPAddress.Parse(ipv.Trim()));
}
else
{
ipAddresses.Add(System.Net.IPAddress.Parse(ipv));
}
}
}
if (request.UserHostAddress != null)
{
if (request.UserHostAddress.Contains(":"))
{
var array = request.UserHostAddress.Split(':');
ipAddresses.Add(array.Length == 2 ? System.Net.IPAddress.Parse(array[0].Trim()) : System.Net.IPAddress.Parse(request.UserHostAddress.Trim()));
}
else
{
ipAddresses.Add(System.Net.IPAddress.Parse(request.UserHostAddress));
}
}
return ipAddresses;
}