IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Discussion :

Récupérer IP client dans wcf


Sujet :

Services Web

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Points : 93
    Points
    93
    Par défaut Récupérer IP client dans wcf
    Bonjour,

    Je suis confronter à un problème : compter le nombre de client connecté à mon web service.

    J'ai pensé à comptabilisé le nombre de connexion en différenciant le nombre d'ip différente connecté à mon web service.

    J'ai essayé de récupéré en vain l'adresse IP du client à sa connexion avec toutes les différentes méthodes que j'ai pu trouver sur internet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    private string GetCustomerIP()
            {
                string CustomerIP = "";
                try
                {
                    if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null)
                    {
                        CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
                    }
                    else
                    {
                        CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
                    }
                }
                catch
                { }
     
                try
                {
                    CustomerIP = System.Web.HttpContext.Current.Request.UserHostAddress;
                }
                catch
                { }
     
                try
                {
                    CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
                }
                catch
                { }
     
                try
                {
                    string clientIP;
                    string ip = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
                    if (!string.IsNullOrEmpty(ip))
                    {
                        string[] ipRange = ip.Trim().Split(',');
                        int le = ipRange.Length - 1;
                        clientIP = ipRange[le];
                    }
                    else
                        clientIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
                }
                catch
                { }
     
                // Get message properties from current OperationContext
                System.ServiceModel.Channels.MessageProperties props = System.ServiceModel.OperationContext.Current.IncomingMessageProperties;
     
                // Find the RemoteEndpointMessageProperty
                System.ServiceModel.Channels.RemoteEndpointMessageProperty prop = (System.ServiceModel.Channels.RemoteEndpointMessageProperty)props[System.ServiceModel.Channels.RemoteEndpointMessageProperty.Name];
     
                // Retrieve the IP address
                string addr = prop.Address;
                int iPort = prop.Port;
     
                return addr;
            }
    Seulement toutes ces fonctions me retourne l'erreur suivante :
    La valeur n'est pas comprise dans la plage attendue.
    Et l'utilisation du OperationContext me retourne une chaine d'adresse vide ("") !

    J'utilise un web service avec une liaison WSDualHttpBinding et les caractéristique suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    Avez vous une idée d'où le problème peut venir ? et/ou Avez vous d'autres propositions pour connaitre le nombre de client actuellement connecté ?

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Pour utiliser System.Web.HttpContext.Current.Request.UserHostAddress, il faut au préalable vérifier que la comptabilité ASP.NET est activée dans le web.config :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    </system.serviceModel>
    Cela permet d'accéder au contexte ASP.NET.

    Sinon, il y a une autre méthode décrite ici : Detect Client IP in WCF 3.5.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Points : 93
    Points
    93
    Par défaut
    Oui ça c'est déjà fait aussi (la configuration du web.config) et la méthode montré dans le lien c'est exactement la même que celle que je fait à la fin avec OperationContext et où j'obtient une adresse vide ("")

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Etrange, en tout cas ça risque d'être compliqué de faire ce que tu veux, car les connexions ne durent que quelques secondes à chaque fois. En plus l'IP n'identifie pas forcément une seule et unique personne.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Points : 93
    Points
    93
    Par défaut
    Oui je le reconnais. Enfin pour l'instant j'ai pas trop encore décidé de ce que j'allais faire exactement mais vu que j'avais pensée à cette solution j'aurais aimé au moins réussir à récupéré l'IP pour finir mon test.

    Après je suis aussi preneuse d'autre solution ou proposition en ce qui concerne la gestion des sessions utilisateurs et/ou instance du web service. Le but étant de pouvoir détecter la connexion d'un utilisateur et sa déconnexion.

    Ceci afin de comprendre comment fonctionne ce système et de voir les différentes possibilités. Sachant que je cherche au final à vérifier si les identifiants d'un utilisateur son bien utilisé que par une personne à la fois.

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Nanais19 Voir le message
    Oui je le reconnais. Enfin pour l'instant j'ai pas trop encore décidé de ce que j'allais faire exactement mais vu que j'avais pensée à cette solution j'aurais aimé au moins réussir à récupéré l'IP pour finir mon test.
    Il faudrait analyser ton web.config et ton code, il doit y avoir quelque chose qui coince, mais ça ne doit pas être évident à trouver.

    Citation Envoyé par Nanais19 Voir le message
    Après je suis aussi preneuse d'autre solution ou proposition en ce qui concerne la gestion des sessions utilisateurs et/ou instance du web service. Le but étant de pouvoir détecter la connexion d'un utilisateur et sa déconnexion.

    Ceci afin de comprendre comment fonctionne ce système et de voir les différentes possibilités. Sachant que je cherche au final à vérifier si les identifiants d'un utilisateur son bien utilisé que par une personne à la fois.
    Pourquoi ne pas récupérer ces infos côté client puis les envoyer à ton web service ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Pourquoi ne pas récupérer ces infos côté client puis les envoyer à ton web service ?
    Comment ça ?! Mon web service sera exposé à un nombre de client x que je ne connais pas et à qui je ne peux pas faire confiance pour m'envoyer des informations comme celles ci !
    De plus, ils ne doivent surtout pas avoir accès à ce genre d'informations.

    C'est au web service de gérer l'authentification de ses clients.

    Sinon j'ai plein d'autres questions :
    • y a t'il un moyen de comptabiliser le nombre d'instance actuellement ouverte ?
    • y a t'il un moyen de comptabiliser le nombre de session actuellement ouverte ? (normalement c'est le même chiffre car je suis en mode "per session")
    • y a t'il un événement ou une méthode que je puisse personnalisé dans WCF qui est appelé lors de la fermeture de l'instance ?
    • y a t'il un événement ou une méthode que je puisse personnalisé dans WCF qui est appelé lors de la fermeture de session utilisateur ?
    • Puis je configurer dynamiquement le nombre maximum de session (ou d'instance) simultané dans le web service ?
    • Pour être sûre d'avoir bien compris, ServiceHost contient toutes les instances et l'initialisation de ServiceHost n'est pas la même que celle d'une instance ?


    A propos de la question : y a t'il un événement ou une méthode que je puisse personnalisé dans WCF qui est appelé lors de la fermeture de l'instance ?

    J'ai vu que c’était possible de personnaliser la gestion des instances en utilisant l'interface "IInstanceprovider" et que la méthode "ReleaseInstance()" serait appelé au moment de la destruction de l'instance.
    Donc si j'ai bien compris je pourrait tenir un compteur en utilisant cette interface afin de connaitre le nombre de connexion simultané ?
    Mais j'avoue que de me lancé dans ce projet ne me réjouit pas trop car j'ai un peu de mal à comprendre la configuration des méthodes lors de l'initialisation d'une instance.
    Voici un lien qui montre cette interface : http://msdn.microsoft.com/fr-fr/libr...eprovider.aspx

    Merci beaucoup pour vos réponses

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Points : 93
    Points
    93
    Par défaut
    Encore une question qui cette fois, répond un peu à celle ci :
    • Puis je configurer dynamiquement le nombre maximum de session (ou d'instance) simultané dans le web service ?
    J'ai vu que on pouvait configurer dans fichier de configuration ces paramètres via la classe "ServiceThrottlongBehavior" disponible via ce lien : http://msdn.microsoft.com/fr-fr/libr.../ms522191.aspx

    Seulement la propriété "MaxConcurrentSessions" s'applique au servicehost et ce configure dans la partie serviceBehavior du fichier de configuration m’amène à me poser la question suivante :
    Le nombre MaxConcurrentSessions compte toutes les sessions de tous les contrats et s'applique à tous les contrats ou le nombre MaxConcurrentSessions comptabilise que les sessions d'un contrat et s'applique à un contrat en particulier ?

    Sachant que chaque contrat peut avoir une configuration serviceBehavior différente, je ne comprend pas trop comme les sessions sont comptabilisé.

    Désolé si je suis un peu chiante avec toutes mes questions...

  9. #9
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    ça fait beaucoup de questions tout ça c'est sûr ! Mais tu n'es pas chiante, je dirais curieuse, et puis c'est le but du forum de répondre aux questions

    Je pense que tu devrais lire les deux liens suivants :
    - Three ways to do WCF instance management
    - WCF Concurrency (Single, Multiple, and Reentrant) and Throttling
    Ils sont illustrés et expliquent de manière détaillée les instances et la concurrence en WCF. Ca devrait répondre à quasiment toutes tes questions
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    232
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 232
    Points : 93
    Points
    93
    Par défaut
    Hihi, ces deux liens je les ai en favoris et je les ai relus beaucoup de fois et ils m'ont effectivement permit de comprendre beaucoup de choses déjà et de me faire quelques tests pour bien comprendre le sujet.

    C'est d'ailleurs après toute cette lecture que m'est venue ces questions un peu plus précises que les premières que j'avais quand j'ai ouvert le post.

    Je fait actuellement pas mal de test pour tester le Throttling et j'ai pu répondre à une de mes questions :
    Citation Envoyé par Nanais19 Voir le message
    Seulement la propriété "MaxConcurrentSessions" s'applique au servicehost et ce configure dans la partie serviceBehavior du fichier de configuration m’amène à me poser la question suivante :
    Le nombre MaxConcurrentSessions compte toutes les sessions de tous les contrats et s'applique à tous les contrats ou le nombre MaxConcurrentSessions comptabilise que les sessions d'un contrat et s'applique à un contrat en particulier ?
    La configuration de "MaxConcurrentSessions" comptabilise toutes les sessions de tous les contrats mélangés.

    Mais ça me perturbe toujours de ne pas pouvoir savoir combien j'ai de session en cours (car même si je les comptabilise moi même je ne sais à quel moment est ce que la session est fermée)

    J'ai fait des tests en changeant les propriétés receiveTimeout et InactivityTimeout qui m'a permit de voir après un Thread.Sleep() que la session étant bien fermé cependant je n'ai toujours pas trouvé d'événement dans le web service qui serait déclencher au moment de la fermeture pour comptabilisé les sessions mais surtout pour à l'avenir arrêter des threads qui pourrait tourner en tâche de fond sur mon serveur.

    C'est donc pour cela que j'ai toujours ces questions en suspend (j'ai enlever celle à laquelle j'ai répondu):

    Citation Envoyé par Nanais19 Voir le message
    • y a t'il un moyen de comptabiliser le nombre d'instance actuellement ouverte ?
    • y a t'il un moyen de comptabiliser le nombre de session actuellement ouverte ? (normalement c'est le même chiffre car je suis en mode "per session")
    • y a t'il un événement ou une méthode que je puisse personnalisé dans WCF qui est appelé lors de la fermeture de l'instance ?
    • y a t'il un événement ou une méthode que je puisse personnalisé dans WCF qui est appelé lors de la fermeture de session utilisateur ?


    J'ai vu que c’était possible de personnaliser la gestion des instances en utilisant l'interface "IInstanceprovider" et que la méthode "ReleaseInstance()" serait appelé au moment de la destruction de l'instance.
    Donc si j'ai bien compris je pourrait tenir un compteur en utilisant cette interface afin de connaitre le nombre de connexion simultané ?
    Mais j'avoue que de me lancé dans ce projet ne me réjouit pas trop car j'ai un peu de mal à comprendre la configuration des méthodes lors de l'initialisation d'une instance.
    Voici un lien qui montre cette interface : http://msdn.microsoft.com/fr-fr/libr...eprovider.aspx

  11. #11
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Nanais19 Voir le message
    Hihi, ces deux liens je les ai en favoris et je les ai relus beaucoup de fois et ils m'ont effectivement permit de comprendre beaucoup de choses déjà et de me faire quelques tests pour bien comprendre le sujet.

    C'est d'ailleurs après toute cette lecture que m'est venue ces questions un peu plus précises que les premières que j'avais quand j'ai ouvert le post.
    Haha C'est vrai qu'ils sont bien fait.

    As-tu connaissance de cela également ? J'ai un peu de mal à naviguer via le menu, mais via les boutons prev et next ça marche bien, même si c'est moins pratique. Jette aussi un oeil à la page Instance Deactivation.

    Concernant tes dernières questions, je ne sais pas si cela est faisable directement en C#. En revanche ça peut être intéressant de regarder du côté des compteurs de performance WCF, que tu peux aussi interroger en WMI :
    - WCF Performance Counters
    - Discover Mighty Instance Management Techniques For Developing WCF Apps

    Et il y a aussi l'AppFabric qui peut être intéressante :
    - Hosting WCF Service in Windows Server AppFabric
    - Monitoring WCF Data Services with Windows Server AppFabric
    - Monitoring WCF service with AppFabric
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/02/2013, 16h09
  2. Réponses: 2
    Dernier message: 04/04/2012, 19h16
  3. Récupérer les messages dans une application cliente
    Par NetLandGim dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/08/2011, 14h19
  4. récupérer ip client WCF 3.0
    Par giova_fr dans le forum Windows Communication Foundation
    Réponses: 10
    Dernier message: 03/06/2011, 12h36
  5. Réponses: 6
    Dernier message: 30/04/2004, 15h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo