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

Windows Communication Foundation .NET Discussion :

[c# - Wcf] plusieurs services sur un meme host ?


Sujet :

Windows Communication Foundation .NET

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut [c# - Wcf] plusieurs services sur un meme host ?
    Bonjour,

    Dans le cadre d'une application distribuée, j'ai besoin de fournir des services (et donc de les consommer de l'autre coté).

    Ma question est, est-til possible, avec WCF, (.NET3) de fournir plusieurs services sur un host identique. (Host identique signifie meme IP et meme port TCP/IP)

    Car dès lors que je fourni un service j'utilise ServiceHost qui se construit avec soit un singleton vers une classe implantant le service, soit avec le type de ce singleton et la liste d'uri.

    Donc en gros est t'il possible d'avoir plusieurs ServiceHost (un pour chaque type de service) avec meme binding, meme endroint, mais contrats différents) ? quitte à changer les uri des endpoint genre:

    premier : net.tcp://srv-host:3000/servA
    second : net.tcp://srv-host:3000/servB

    Ou dois-je absolument changer de port TCP ?

    (Perso ca m'arrangerais de ne pas avoir à changer de port, et l'usage de canaux nommés n'est pas envisageable.)

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    Je viens d'essayer et ça semble marcher, aprés tout les deux URL sont différentes (ServA, ServB). De ton côté tu as des problèmes ?

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    Du coup j'ai un autre problème.

    En fait j'ai besoin de déterminer le type de l'interface à récupérer à l'exécution et non à la compilation...
    Or pour consommer le service, on utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ChannelFactory<InterfaceService>
    avec InterfaceService l'interface en question, or à la compilation je ne le connais pas, je ne peux donc pas passer par ChannelFactory...
    Alors si quelqu'un à une solution je suis tout ouie...

    Merci

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Je ne suis pas sur de comprendre. J'ai à peine jeté un oeil à Wcf donc je vais peut être dire des bêtises mais côté client tu as besoin d'un proxy vers tes services, pas directement de l'interface qu'implémentent tes services non ?

    Tu as besoin de faire quoi en fait, découvrir à l'exécution quels services sont dispo à l'url net.tcp://srv-host:3000 ?

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    Non ca, c'est déjà réglé bien avant.

    Quand tu déclare un service sur le serveur et sur le client tuas un

    [ServiceContract]
    interface InterfaceService
    {
    ...
    }

    et dans le client pour le consommer tufait

    InterfaceService serv = (new ChannelFactory<InterfaceService>(binding, endpoint)).CreateChannel();

    Mon problème c'est que mon appli utilise la reflection PARTOUT et donc InterfaceService n'est pas connu au moment de la compilation ce qui me pose un probleme pour instancier un ChannelFactory qui est une classe générique...

    a l'exécution je connais l'interface dont j'ai besoin, mais pas à la compilation... Or pour faire une instanciation de ChannelFactory il me faut imposer un type à la compilation... ce type pouvant varier à l'exécution, c'est très génant

    j'espère avoir été plus claire...
    en attendant, j'utilise un méthode un peu gore, vu que j'utilise CodeDom pour générer du code à la volée et l'utiliser toujours par Reflection... mais bon... c'est lent et pas génial comme méthode, et bonjour la maintenance.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Mais InterfaceService doit être connu par le client et le serveur, tu veux dire que le serveur crée aussi des services dynamiquements ?

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    Tout est entièrement dynamique, et créé à la volée.

    Lorsque je lance l'appli en mode service, les "modules" qui fournissent des services les enregistres et le moteur ce charge de les distribuer.
    Si un module au sein de l'appli (en mode service ou en mode normal) a besoin d'un service distribué, elle l'indique, et lorsque le module est chargé... les connexions aux différents services distribués sont effectuées, en arrière plan par le noyau... sans que le module n'ai le moindre code à utiliser.
    Si le module nécessitant un service tourne sur l'appli en mode service, le noyau lui fourni aussitot le service sans passer par la couche communicationnelle... (logique), sinon on passe ca passe par les WCF.

    C'est une façon de minimiser le code des modules, d'éviter la multiplication des technologies qui pourraient se nuires mutuellements, et d'éviter les conflits, et tout est résolu automatiquement par le noyau de l'appli.

    D'ailleurs du coup j'ai un autre problème que je vais décrir dans un autre topic, en ce qui concerne CodeDom.

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut Présence ou non du serveur de webservices
    Bon ca c'est règlé, finallement j'ai trouvé une solution hybride mais maintenant suis emmerdé ...

    Dès lors que l'on créé un ChannelFactory et que l'on fait un CreateChannel, il retourne TOUJOURS un proxy. Jusque là tout est normal.

    En revanche mon problème c'est que si pour une raison X ou Y, le serveur de services distribué est absent... ou innacessible... et bien BOOOOM

    Ce que je souhaite faire c'est forcer la détection de la présence du serveur (donc à voir si le canal est réellement ouvert) toujours en ce souvenant que je ne connais pas à priori le contenu de l'interface dans la mesure où j'use de la reflexion.
    Le but est de détecter tout problème de connexion avant meme de rendre la main au module qui nécessitait le webservice.

    Donc je me suis dit je vais essayer en faisant Open() sur le ChannelFactory<>... mais euh voila... rien nada... il me dit Opened meme s'il n'y a rien de réellement ouvert, vu que le serveur n'est pas là... (c'est fait exprès)
    Il me faut donc pouvoir vérifier la présence ou non du serveur et s'il est présent, qu'il accepte les connexions et les requêtes.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    Bon alors finallement après moultes essaies...

    J'ai fini par trouver....

    en fait ChannelFactory<TChannel> retourne un Proxy qui implante deux interfaces.

    le premier est l'interface du service souhaité, et le second l'interface IChannel.
    Il suffit donc de faire IChannel.Open() sur le proxy retourné.
    et si après exécution de IChannel.Open() le IChannel.State est différent de CommunicationObjects.Opened et bien c'est qu'il ya une erreur.

    D'ailleurs selon le type d'erreur, Open retournera ou non une exception. Exemple s'il n'arrive pas à contacter l'hôte TCP, ou que l'hote lui ferme la porte au nez... il leve une exception TCP Error

    Le seul truc pénible c'est que j'ai pas réussi à ce jour à modifier le TimeOut sur l'open du ICanal et par défaut il est de 30s.

    Voili voilou...

  10. #10
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par cinemania
    Bon alors finallement après moultes essaies...

    J'ai fini par trouver....

    en fait ChannelFactory<TChannel> retourne un Proxy qui implante deux interfaces.

    le premier est l'interface du service souhaité, et le second l'interface IChannel.
    Il suffit donc de faire IChannel.Open() sur le proxy retourné.
    et si après exécution de IChannel.Open() le IChannel.State est différent de CommunicationObjects.Opened et bien c'est qu'il ya une erreur.

    D'ailleurs selon le type d'erreur, Open retournera ou non une exception. Exemple s'il n'arrive pas à contacter l'hôte TCP, ou que l'hote lui ferme la porte au nez... il leve une exception TCP Error

    Le seul truc pénible c'est que j'ai pas réussi à ce jour à modifier le TimeOut sur l'open du ICanal et par défaut il est de 30s.

    Voili voilou...
    ça ça va directement dans la FAQ le coup du Open
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  11. #11
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par cinemania
    Le seul truc pénible c'est que j'ai pas réussi à ce jour à modifier le TimeOut sur l'open du ICanal et par défaut il est de 30s.
    Tu as essayé le Open(new TimeSpan(3000) ) ; ?
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    Ba dans la mesure ou je suis un pure sauvage... j'ai comment dire mis la connexion sur un thread secondaire, et fait joindre le thread principal sur la mort du thread secondaire. Le join avec un timeout fait que quand il sort, si l'autre a pas fini ba on considère qu'il y a une erreur et on détruit les différentes ressources ouvertes.

  13. #13
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par cinemania
    Ba dans la mesure ou je suis un pure sauvage... j'ai comment dire mis la connexion sur un thread secondaire, et fait joindre le thread principal sur la mort du thread secondaire. Le join avec un timeout fait que quand il sort, si l'autre a pas fini ba on considère qu'il y a une erreur et on détruit les différentes ressources ouvertes.
    euh ... sans commentaires aucuns alors
    - MVP C#
    -Tout problème a une solution, le vrai problème est de trouver la solution .....
    - Linux & mono : l'avenir

  14. #14
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Citation Envoyé par cinemania Voir le message
    Ba dans la mesure ou je suis un pure sauvage... j'ai comment dire mis la connexion sur un thread secondaire, et fait joindre le thread principal sur la mort du thread secondaire. Le join avec un timeout fait que quand il sort, si l'autre a pas fini ba on considère qu'il y a une erreur et on détruit les différentes ressources ouvertes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. plusieurs action sur un meme bouton
    Par francksilvagni dans le forum Flash
    Réponses: 8
    Dernier message: 04/05/2007, 17h54
  2. [MySQL] Plusieurs jointures sur une même table
    Par stephyyr dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2006, 14h24
  3. debutant lecture de plusieur variable sur une meme ligne
    Par Slumpy dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 16/06/2006, 19h37
  4. Plusieurs jointures sur la meme table [complexe]
    Par Wells dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 11h41
  5. plusieurs sessions sur un même PC
    Par mouloudéen dans le forum Windows XP
    Réponses: 9
    Dernier message: 02/06/2006, 11h11

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