10 votes

Adresse distante IPv4 dans WCF

En rapport avec Comment obtenir l'adresse IP d'un point de terminaison distant WCF ?

J'utilise ce code pour récupérer l'adresse IP distante lorsqu'une méthode de travail est invoquée :

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;
}

Cependant, l'adresse que je reçois en retour est "::1". Je ne veux pas l'adresse IPv6, mais l'adresse IPv4 (127.0.0.1). Y a-t-il un moyen de la forcer ?

6voto

marc_s Points 321990

Non, je ne pense pas. En fait, vous lisez simplement une propriété définie par le client au moment de l'appel. Votre seule option serait de demander au client (par le biais d'une configuration) d'utiliser IPv4 au lieu d'IPv6 à tout moment (c'est-à-dire de désactiver IPv6).

Je ne suis pas au courant d'un paramètre WCF pour imposer cela - vous devriez creuser dans la pile de réseau et voir s'il y a un moyen de lui faire utiliser des adresses IPv4 au lieu d'IPv6.

4voto

Warren Points 2273

Vous voyez ::1 parce que vous vous connectez au service en résolvant le nom "localhost" au lieu de l'adresser comme "127.0.0.1". Les versions modernes de Windows dont la pile IPv6 est activée utiliseront IPv6 en premier.

Vous pouvez désactiver la pile IPv6, mais cela revient à peu près à faire l'autruche et à mettre la tête dans le sable. IPv6 est là, et les gens l'utilisent sur leurs réseaux. Votre application doit donc être prête à le prendre en charge.

2voto

Murat Eraydin Points 21

Voici une solution de contournement : (Vous pouvez stocker les valeurs dans une table de hachage pour éviter de multiples opérations 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;
        }
    }

2voto

Denis Mazourick Points 910

La solution de contournement proposée par Murat ne fonctionnera pas. Le MSDN indique que si vous passez l'adresse IP à la méthode GetHostAddresses, cette adresse est renvoyée dans un tableau sans interroger le DNS. Pour que cela fonctionne, vous devrez d'abord demander le nom de l'hôte, en utilisant la méthode GetHostEntry. Puis, en utilisant le nom d'hôte, utiliser la méthode GetHostAddresses. Toutefois, même le GetHostEntry peut contenir la liste d'adresses qui vous suffira.

0voto

yowaiOtoko Points 9

Vous pourriez utiliser AddressFamily.InterNetwork == address.AddressFamily et AddressFamily.InterNetworkV6 comme test au lieu de rechercher les " :" ou "." dans les chaînes d'adresses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X