为什么我在ASP.NET中得到的IP地址是::1,如何获取正确的IP地址?

21

我正在本地主机上运行一个用Visual Studio提供的ASP.NET MVC应用程序。我想要获取IP地址。我尝试过:

Request.UserHostAddress

Request.ServerVariables("REMOTE_ADDR")

在这两种情况下,我都会得到::1作为结果。这是什么?我为什么会得到它?我怎样才能得到127.0.0.1或192.168.1.xxx?


请查看https://dev59.com/MUfSa4cB1Zd3GeqPA-WX。 - Mark
6个回答

22

你正在获得有效的IP地址;::1是IPv6的本地主机。


2
好的,那么我该如何获取IPv4 IP地址呢? - user529141
2
哦,哇!这是因为它只是同一台机器 - localhost 才能这样工作吗?当我部署到生产服务器时,我也会得到 IPv6 地址吗?我不想要客户的 IPv6 地址,我想要他们的 IPv4 地址.. 我该如何获取它们? - user529141
2
这是一个很好的例子:http://www.4guysfromrolla.com/articles/071807-1.aspx。尽管展示用法的最后一部分需要从`IP4.GetIP4Address`更改为`IPNetworking.GetIP4Address()`(在VB.NET中我使用`()`即使在无参数的方法上,但类名是关键)。 - pickypg
1
但我想要正确的IP地址,而不是像::1这样的。 - user7918630

16

当您调用“localhost”时所看到的是有效的。::1是IPv6环回地址,相当于IPv4中的127.0.0.1。

不要调用:

http://localhost/...

调用:

http://{machinename}/...
或者
http://127.0.0.1/...
或者
http://192.168.1.XXX/...

[将{machinename}替换为您机器的计算机名称。 将XXX替换为您计算机的IP地址。]

调用MVC应用程序的任何人都将得到他们的有效IP地址。 如果客户端是IPv6主机,则将保存其IPv6 IP地址。 如果客户端是IPv4主机,则将保存其IPv4 IP地址。

如果您始终希望保存IPv4地址,请查看此文章,了解如何使用简单类来实现它:https://web.archive.org/web/20211020102847/https://www.4guysfromrolla.com/articles/071807-1.aspx。 您应该能够借鉴他们的示例并构建一个快速的辅助方法来实现此目标。


嗯...我把localhost替换成了127.0.0.1,它显示出来了。但是用机器名不行。我收到了“无法连接”的错误提示。 - user529141
我也尝试了这个,但解决方案是相同的,我得到了::1。 - user7918630

1
Request.Params["REMOTE_ADDR"]

使用Request.ServerVariables("REMOTE_ADDR")的替代方法


是的,我研究了一下。基本上发生的情况是,您的计算机正在使用新的IP系统。IPv6中的localhost是::1 - http://social.msdn.microsoft.com/forums/en-US/wcf/thread/36f57ccf-7a76-4843-84bd-7bb945aad23f/。如果您从IPv4客户端访问,则会得到IPv4地址。 - slandau

1
如果您想让本地主机返回127.0.0.1,可能需要更改您的“hosts”文件。您可以在“%systemdrive%\Windows\System32\drivers\etc”中找到它。
对我有用,现在我使用“Request.ServerVariables [“REMOTE_ADDR”]”得到了127.0.0.1。我取消注释了127.0.0.1(删除#)。
在这里,您可以找到默认的hosts文件 http://support.microsoft.com/kb/972034 我的文件
#本地主机名解析是在DNS内部处理的。
127.0.0.1       localhost

# ::1 localhost


但我想要正确的IP地址,不要像::1那样?请有人帮帮我。 - user7918630

0

以下代码是我用来查找IP地址的

public static string GetIp()
        {
            var Request = HttpContext.Current.Request;

            try
            {

                Console.WriteLine(string.Join("|", new List<object> {
                    Request.UserHostAddress,
                    Request.Headers["X-Forwarded-For"],
                    Request.Headers["REMOTE_ADDR"]
                })
                );

                var ip = Request.UserHostAddress;
                if (Request.Headers["X-Forwarded-For"] != null)
                {
                    ip = Request.Headers["X-Forwarded-For"];
                    Console.WriteLine(ip + "|X-Forwarded-For");
                }
                else if (Request.Headers["REMOTE_ADDR"] != null)
                {
                    ip = Request.Headers["REMOTE_ADDR"];
                    Console.WriteLine(ip + "|REMOTE_ADDR");
                }
                return ip;
            }
            catch (Exception ex)
            {
                Log.WriteInfo("Message :" + ex.Message + "<br/>" + Environment.NewLine +
                    "StackTrace :" + ex.StackTrace);
            }
            return null;
        }

0
如果您获得了IPv6地址,那么您可以找到对应的有效IPv4地址映射以获取IPv6地址。
以下是C#代码:
  public static string GetIP4Address(string ip) {
        try {
            var hostNames = Dns.GetHostEntry(ip);
            var ipv4 = hostNames.AddressList.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork);
            if(ipv4 != null) {
                return ipv4.ToString();
            }

        } catch(Exception ex) {
            log.WarnFormat("Error When Getting Client Ipv4");
        }

        return ip;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接