如何在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;
}