IIS Request.UserHostAddress 返回 IPV6 (::1),即使禁用了 IPV6

Posted

技术标签:

【中文标题】IIS Request.UserHostAddress 返回 IPV6 (::1),即使禁用了 IPV6【英文标题】:IIS Request.UserHostAddress returning IPV6 (::1), even when IPV6 disabled 【发布时间】:2009-12-19 12:51:14 【问题描述】:

在我的网卡的属性部分,在 windows server 2008 上,我禁用了 IPV6,只启用了 IPV4。

但是在 ASP.NET 中,Request.UserHostAddress 返回 '::1',一个 IPV6 地址。

有人知道如何恢复到 IPV4 吗?

【问题讨论】:

如果你今天阅读这篇文章,在它最初发布多年后,这是一个公共服务公告:你最终必须让你的程序与 IPv6 一起工作。从 Server 2008/Vista 开始,在 Windows 上禁用 IPv6 是 未经测试且不支持的,微软认为 IPv6 是 Windows 的强制部分。 【参考方案1】:

来自 Rolla 网站的 4 Guys 有一个解决方案 here,我在我的应用程序中使用了它。

更新:

以防此链接失效,以下是基于此链接的代码:

public string GetIpAddress()

    string ipAddressString = HttpContext.Current.Request.UserHostAddress;

    if (ipAddressString == null)
        return null;

    IPAddress ipAddress;
    IPAddress.TryParse(ipAddressString, out ipAddress);

    // If we got an IPV6 address, then we need to ask the network for the IPV4 address 
    // This usually only happens when the browser is on the same machine as the server.
    if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
    
        ipAddress = System.Net.Dns.GetHostEntry(ipAddress).AddressList
            .First(x => x.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
    

    return ipAddress.ToString();

【讨论】:

干净的解决方案,不需要更改配置,在本地机器上工作。 作为最佳实践,您应该评估 TryXXX 语句的结果: if(IPAddress.TryParse(ipAddressString, out ipAddress)) ... 【参考方案2】:

如果您连接到 localhost (::1 / 127.0.0.1),则您使用的不是服务器的网卡,而是 Windows 的虚拟网卡。我认为无论如何配置回送卡并从中删除 IPv6,不是不删除整个系统的支持,但在 Win2008 中您可能无法再这样做了。

您可以通过运行网络数据包捕获实用程序来验证您的物理卡没有被使用。在 Windows 中,您永远无法嗅出通过虚拟环回卡的流量。

也就是说,如果您从另一台机器访问(通过将通过您的物理卡的连接),您应该会看到 Request.UserHostAddress 返回的 IPv4 地址

【讨论】:

【参考方案3】:

    进入开始 -> 点击控制面板 -> 在控制面板窗口点击View network status and tasks -> 在Network and Sharing Center窗口点击change adapter settings

    Network Connections 窗口将出现。在这里,您右键单击要禁用 IPv6 的network adapter(可以是无线适配器或有线以太网适配器),然后单击Properties

    network adapter properties 窗口中,取消选中Internet Protocol Version 6 (TCP/IPv6) 并单击确定。

    在命令提示符下输入regedit 启动注册表编辑器,然后在注册表编辑器中找到以下注册表项。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\DisabledComponents
    

    如果DisabledComponents 项不可用,您必须通过转到编辑 -> 新建 -> DWORD(32 位)值并将值设置为 0xffffffff(只需键入 @ 987654333@)。这将禁用除 IPv6 环回接口之外的所有 IPv6 功能,最后单击OK

    重新启动计算机。

【讨论】:

以上是关于IIS Request.UserHostAddress 返回 IPV6 (::1),即使禁用了 IPV6的主要内容,如果未能解决你的问题,请参考以下文章

服务器——IIS——IIS Express——IIS跟IIS Express之间的区别和关系

iis运行asp网页显示空白

iis 配置 rewrite

iis6.0下载和安装问题

IIS是啥意思

iis如何配置