IIS Request.UserHostAddress, возвращающий IPV6 (:: 1), даже когда IPV6 отключен - PullRequest
30 голосов
/ 19 декабря 2009

В разделе свойств моей сетевой карты на Windows Server 2008 у меня отключен IPV6, оставлен включенный только IPV4.

Однако в ASP.NET Request.UserHostAddress возвращает «:: 1», адрес IPV6.

Кто-нибудь знает, как вернуться к IPV4?

Ответы [ 3 ]

34 голосов
/ 22 декабря 2011

На сайте 4 Guys from Rolla есть решение здесь , которое я использовал в своем приложении.

Обновление:

На случай, если эта ссылка не работает, вот код, основанный на этой ссылке:

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();
}
23 голосов
/ 19 декабря 2009

Если вы подключаетесь к localhost (:: 1 / 127.0.0.1), вы используете не сетевую карту, установленную на вашем сервере, а виртуальную карту Windows. Я не думаю, что в любом случае есть настройка петлевой карты и удаление из нее IPv6, не исключая поддержки всей системы, но в Win2008 вы, вероятно, больше не сможете этого делать.

Вы можете убедиться, что ваша физическая карта не используется, запустив утилиты захвата сетевых пакетов. В Windows вы никогда не сможете прослушать трафик, который проходит виртуальная петлевая карта.

Тем не менее, если вы получаете доступ с другого компьютера (через соединение, которое будет проходить через вашу физическую карту), вы должны увидеть адрес IPv4, возвращаемый Request.UserHostAddress

4 голосов
/ 13 сентября 2012
  1. Перейдите в Пуск -> нажмите на панель управления -> нажмите View network status and tasks в окне панели управления -> нажмите change adapter settings в Network and Sharing Center окне.

  2. Network Connections появится окно. Здесь вы щелкаете правой кнопкой мыши на network adapter (может быть беспроводной адаптер или проводной адаптер Ethernet), для которого вы хотите отключить IPv6, и нажимаете Properties.

  3. В окне network adapter properties снимите флажок Internet Protocol Version 6 (TCP/IPv6) и нажмите OK.

  4. Введите regedit в командной строке для запуска редактора реестра, перейдите к поиску следующего элемента реестра в редакторе реестра.

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\DisabledComponents
    
  5. Если элемент DisabledComponents недоступен, необходимо создать его в следующем формате, перейдя в меню «Правка» -> «Создать» -> «DWORD» (32-разрядная версия) и установите значение 0xffffffff (просто введите ffffffff). Это отключит все функции IPv6, кроме петлевого интерфейса IPv6, наконец нажмите OK.

  6. Перезагрузите компьютер.

...