IPv4 удаленный адрес в WCF

Связанный с тем, Как получить 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) - какой-либо способ вызвать это?

9
задан Community 23 May 2017 в 12:33
поделиться

3 ответа

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

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

4
ответ дан 4 December 2019 в 20:24
поделиться

Вот обходной путь: (Вы можете сохранить значения в хэш-таблице, чтобы избежать множественных операций 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;
        }
    }
2
ответ дан 4 December 2019 в 20:24
поделиться

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

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

3
ответ дан 4 December 2019 в 20:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: