Удаленный адрес IPv4 в WCF - PullRequest
9 голосов
/ 08 января 2010

Относится к Как получить IP-адрес удаленной конечной точки WCF?

Я использую этот код для получения удаленного IP-адреса при вызове метода рабочего процесса:

private static string GetRemoteIP()
{
  var oc = OperationContext.Current;
  var mp = oc.IncomingMessageProperties;
  var remp = mp[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;

  return remp == null ? "(unknown)" : remp.Address;
}

Однако адрес, который я получаю, это ":: 1". Я не хочу IPv6-адрес, я хочу IPv4-адрес (127.0.0.1) - каким-либо образом заставить это?

Ответы [ 5 ]

4 голосов
/ 08 января 2010

Нет, я так не думаю. Вы просто считываете свойство, установленное клиентом во время вызова. Единственным вариантом будет указание клиенту (через некоторую конфигурацию) постоянно использовать IPv4 вместо IPv6 (т.е. отключать IPv6 все вместе).

Мне не известны какие-либо настройки WCF для обеспечения этого - вам придется копаться в сетевом стеке и посмотреть, есть ли способ заставить его использовать адреса IPv4 вместо IPv6.

3 голосов
/ 27 мая 2010

Вы видите :: 1, потому что вы подключаетесь к службе, разрешив имя «localhost» вместо того, чтобы называть его «127.0.0.1». Современные версии Windows, в которых включен стек IPv6, сначала будут использовать IPv6.

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

2 голосов
/ 01 декабря 2010

Обход, предложенный Мурат, не будет работать. В MSDN говорится - если вы передаете IP-адрес методу GetHostAddresses, этот адрес возвращается в массиве без запроса DNS. Чтобы заставить его работать, вам нужно сначала запросить имя хоста, используя метод GetHostEntry. А затем, используя имя хоста, используйте GetHostAddresses. Однако даже у GetHostEntry может быть список адресов, который вам будет достаточно.

2 голосов
/ 13 февраля 2010

Вот обходной путь: (Вы можете сохранить значения в хеш-таблице, чтобы избежать нескольких операций DNS)

    static string GetClientIP()
    {
        var context = OperationContext.Current;
        var mp = context.IncomingMessageProperties;
        var propName = RemoteEndpointMessageProperty.Name;
        var prop = (RemoteEndpointMessageProperty) mp[propName];
        string remoteIP = prop.Address;

        if(remoteIP.IndexOf(":") > -1)
        {
            IPAddress[] addresses = Dns.GetHostAddresses(remoteIP);
            for (int i = 0; i < addresses.Length; i++)
            {
                if(addresses[i].ToString().IndexOf(".")>-1)
                    return addresses[i].ToString();
            }
            return remoteIP;
        }
        else
        {
            return remoteIP;
        }
    }
0 голосов
/ 23 сентября 2015

Вы можете использовать AddressFamily.InterNetwork == address.AddressFamily и AddressFamily.InterNetworkV6 в качестве теста вместо поиска ":" или "." в адресных строках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...