【问题标题】:Why am I getting ::1 as the IP address in ASP.NET, and how to get the proper IP address?为什么我得到 ::1 作为 ASP.NET 中的 IP 地址,以及如何获得正确的 IP 地址?
【发布时间】:2016-01-21 12:33:52
【问题描述】:

我在 localhost - 使用 Visual Studio 提供的开发服务器中运行 ASP.NET MVC 应用程序。我想获取IP地址。我试过了

Request.UserHostAddress

Request.ServerVariables("REMOTE_ADDR")

在这两种情况下,我都得到::1 结果。它是什么?为什么我会得到它?如何获取 127.0.0.1 或 192.168.1.xxx?

【问题讨论】:

标签: asp.net-mvc vb.net ip-address


【解决方案1】:

您在调用“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 地址,请查看这篇文章,了解他们是如何使用简单的 http://www.4guysfromrolla.com/articles/071807-1.aspx 类完成它的。您应该能够以他们为榜样,并构建一个快速的辅助方法来完成此操作。

【讨论】:

  • 好吧..我用 127.0.0.1 替换了 localhost ,它表明了这一点。按机器名称不起作用。我收到“无法连接”错误..
  • 我也试试这个,但解决方案是一样的,我得到::1
【解决方案2】:
Request.Params["REMOTE_ADDR"]

而不是Request.ServerVariables("REMOTE_ADDR")

【讨论】:

【解决方案3】:

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

【讨论】:

  • 好吧.. 那么我怎样才能获得 IPv4 IP?
  • 哦哇!这是否只是因为它是同一台机器 - localhost。当我部署到 prod 服务器时,我是否也会获得 IPv6 地址?我不想要客户的 IPv6 地址,我想要他们的 IPv4 地址。我怎样才能得到它们?
  • Here's a good example。虽然显示用法的最后一位需要从IP4.GetIP4Address 更改为IPNetworking.GetIP4Address()(我使用(),即使在VB.NET 中的无参数方法上,但类名是关键)
  • 但我想要正确的 IP 地址?我不想喜欢 ::1
【解决方案4】:

如果您希望 localhost 返回 127.0.0.1,也许您需要更改“主机”文件。 您可以在“%systemdrive%\Windows\System32\drivers\etc”中找到它

它对我有用,现在我得到 127.0.0.1 和“Request.ServerVariables[“REMOTE_ADDR”]”。我取消注释 127.0.0.1(删除 #)。

在这里你可以找到默认的主机文件 http://support.microsoft.com/kb/972034

我的文件

# localhost 名称解析在 DNS 本身内处理。

127.0.0.1       localhost

# ::1 本地主机

【讨论】:

  • 但我想要正确的 IP 地址不喜欢 ::1?请任何人帮助我
【解决方案5】:

下面是我用来查找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;
        }

【讨论】:

    【解决方案6】:

    如果你得到了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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-18
      • 2021-03-03
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多