【问题标题】:Removing the port from a IP string that is IPv6 safe in C#从 C# 中 IPv6 安全的 IP 字符串中删除端口
【发布时间】:2015-10-10 14:38:50
【问题描述】:

对于在 ASP.NET MVC 上运行的 rest API 中发出请求的用户,我需要没有端口的 IP。似乎获取地址的方法是这些的组合:

HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]
HttpContext.Current.Request.UserHostAddress;

这给了我一个带有 IP:Port 的字符串

IPV4 很简单,但从阅读中我预计 IPV6 会给我这样的东西:

[1fff:0:a88:85a3::ac1f]:8001

IPAddress.Parse 可以处理带有端口的 IPv6,但不能处理带有端口的 IPv4,这很奇怪。

我可以检查字符串以查看它是什么类型的地址,但我觉得应该有更好的方法。

有什么想法吗?

【问题讨论】:

  • 我不会将其标记为重复,但您可能会对此答案感兴趣 - stackoverflow.com/a/12044845/3032289 使用 Uri 也可能是一种选择,尽管它......并不完全干净。
  • 与我当前版本类似的方法,真的希望有一个框架方法来做到这一点,比如 IPEndpoint.Parse。但看起来必须这样做。
  • 好吧,公平地说,在 IP 地址中包含端口并不是完全标准化的数据。这些确实应该是两个独立的字段,因为与 IP 地址和端口不同,IP 端点没有标准。另外,请注意X-Forwarded-For应该包含所有在途的代理,包括原始客户端,用逗号分隔。当然,它也不可靠。 UserHostAddress 只会为您提供链中的最新地址,这往往是客户端和服务器之间的最后一个路由器。如果您可以避免使用 IP 地址,那就这样做吧 - 它不可靠而且很烦人。
  • 该API用于将游戏服务器注册到主服务器。 IP 地址被提供给其他客户端,以便它们可以连接到游戏服务器。在这种情况下,链中的最后一个路由器是唯一有用的信息,因为游戏服务器必须具有到其外部 IP 的开放端口才能在游戏中连接。我应该在 X_FORWARDED_FOR 上阅读更多内容,看来我根本不应该使用它。无论哪种方式,问题都是一样的。
  • 从 ASP.NET MVC 获取端点的更好方法是更好的解决方案。

标签: c# asp.net-mvc ipv6


【解决方案1】:

这是我的临时版本

public string StripPortFromEndPoint(string endPoint)
{
    var splitList = endPoint.Split(':');
    if (splitList.Length > 2)
    {
        endPoint = IPAddress.Parse(endPoint).ToString();
    }
    else if (splitList.Length == 2)
    {
        endPoint = splitList[0];
    }
    else
    {
        throw new ParseException("No port separator found",0);
    }

    return endPoint;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2013-09-10
    • 2022-01-09
    相关资源
    最近更新 更多