【发布时间】: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