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 Presentation Foundation Discussion :

changement dynamique d'url d'une référence web


Sujet :

Windows Presentation Foundation

  1. #1
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut changement dynamique d'url d'une référence web
    Bonjour tout le monde,

    J'ai une application WPF qui est cliente d'un service web.
    Ce service web peut se situer sur plusieurs serveurs.

    J'ai donc ajouté une référence web à mon projet et maintenant, je cherche à pouvoir changer son url.

    Ce n'est plus la propriété MonInstanceWS.url qu'il faut changer mais à priori (de ce que je vois dans l'aide) les propriétés Endpoint et RemoteAddress.

    J'ai remarqué qu'il y a plusieurs constructeurs dans le reference.cs hérités de System.ServiceModel.ClientBase :
    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
    [System.Diagnostics.DebuggerStepThroughAttribute()]    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
    public partial class MonWSSoapClient : System.ServiceModel.ClientBase<WpfApplication5.MonWS.TMonWSSoap>, WpfApplication5.MonWS.TMonWSSoap {
     
            public TMonWSSoapClient() {
            }
     
            public TMonWSSoapClient(string endpointConfigurationName) : 
                    base(endpointConfigurationName) {
            }
     
            public TMonWSSoapClient(string endpointConfigurationName, string remoteAddress) : 
                    base(endpointConfigurationName, remoteAddress) {
            }
     
            public TMonWSSoapClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
                    base(endpointConfigurationName, remoteAddress) {
            }
     
            public TMonWSSoapClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                    base(binding, remoteAddress) {
            }
     
            [...]
    }
    Le constructeur sans paramètre instancie un channel avec l'adresse de ma référence web actuelle qui est au format "http://<IP>:<Port>/<ma_page>.asmx". Ca se passe sans aucun problème.

    En regardant l'aide des constructeurs qui prennent une ou deux string, voici ce que j'ai sur les paramètres :
    - "endpointConfigurationName : Nom du point de terminaison dans le fichier de configuration de l'application"
    - "remoteAddress : Adresse du service."

    Je ne trouve aucun exemple d'utilisation de ces constructeurs et après plusieurs essais, je ne vois pas ce qu'il faut indiquer comme adresse (le wsdl, l'asmx, juste l'adresse et le port...).

    Est-ce que quelqu'un sait comment instancier un ClientBase en lui indiquant quelle url il doit utiliser ou comment changer l'url d'un service web après l'avoir instancié ?

    Cordialement,
    --
    Arnaud DANEELS

  2. #2
    Membre régulier Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 106
    Points
    106
    Par défaut
    Le (ou les) endpoint(s) de ton service, tu le trouve dans le fichier Web.config de ton service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <system.serviceModel>
     <services>
       <service name="Catalogue.Service1" behaviorConfiguration="Catalogue.Service1Behavior">
     
    <!-- Service Endpoints -->
    <endpoint address="" binding="basicHttpBinding" contract="Catalogue.IService1">
    Tu peux lui donner un nom (name=""), je n'ai jamais testé ce que j'avance mais en lui donnant un nom, tu pourras utiliser le constructeur avec la remote address et la changer en fonction du service que tu désires utiliser.

    Non ?

  3. #3
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par cyberbobby Voir le message
    Le (ou les) endpoint(s) de ton service, tu le trouve dans le fichier Web.config de ton service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <system.serviceModel>
     <services>
       <service name="Catalogue.Service1" behaviorConfiguration="Catalogue.Service1Behavior">
     
    <!-- Service Endpoints -->
    <endpoint address="" binding="basicHttpBinding" contract="Catalogue.IService1">
    Tu peux lui donner un nom (name=""), je n'ai jamais testé ce que j'avance mais en lui donnant un nom, tu pourras utiliser le constructeur avec la remote address et la changer en fonction du service que tu désires utiliser.

    Non ?
    Je n'ai pas cette catégorie (system.servicemodel) dans mon web.config.
    Je n'ai que System.Web (avec appSettings).

    Petite précision, c'est un service web en .NET 2 (pas un wcf). Je ne suis pas sûr qu'il y ait un system.servicemodel en .NET 2
    --
    Arnaud DANEELS

  4. #4
    Membre régulier Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 106
    Points
    106
    Par défaut
    Ca doit venir de là alors ...

    Je parlais d'un service WCF moi, pour les autres service, je ne sais pas, désolé.

  5. #5
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    avant, on faisait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonInstanceWS.url = "http://192.168.1.23:4567/HelloWorld.asmx
    Il n'y a pas d'équivalent en .NET 3.5 ?
    --
    Arnaud DANEELS

  6. #6
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut proposition d'une QR
    Ayé ! réussi

    je n'ai trouvé strictement aucun exemple sur Internet, aussi je vous fais part d'une proposition de Question/Réponse du coup

    Environnement : application WPF, .NET 3.5

    QR : Comment indiquer dynamiquement l'url d'un web service ?

    Dans une application WPF, lorsque vous créez une référence de service, vous indiquez l'url à laquelle ce service est disponible (au format "http://<IP_ou_nom_serveur>[:<N°_Port>]/<chemin>/<nom_page_service_.asmx").

    Lorsque vous créez cette référence, Visual Studio 2008 ajoute ceci dans le fichier app.config :
    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
     
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="Tmon_service_WSSoap" closeTimeout="00:01:00" openTimeout="00:01:00"
                        receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
                        bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                        maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                        messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                        useDefaultWebProxy="true">
                        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                        <security mode="None">
                            <transport clientCredentialType="None" proxyCredentialType="None"
                                realm="" />
                            <message clientCredentialType="UserName" algorithmSuite="Default" />
                        </security>
                    </binding>
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost/rep1/mon_service.asmx" binding="basicHttpBinding"
                    bindingConfiguration="Tmon_service_WSSoap" contract="ServicesPersos.Tmon_service_WSSoap"
                    name="RefWebLocal" />
            </client>
        </system.serviceModel>
    où ServicesPersos est le nom du namespace (le nom donné à la référence aussi) et Tmon_service_WSSOAP, le nom de la classe générée.
    On peut voir que deux éléments apparaissent : le binding et le endpoint (point de terminaison).

    Ce qui nous intéresse, c'est de pouvoir changer dynamiquement de point de terminaison.
    Pour cela, ajoutez des noeuds endpoint avec une nouvelle adresse et un nouveau nom comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            <client>
                <endpoint address="http://localhost/rep1/mon_service.asmx" binding="basicHttpBinding"
                    bindingConfiguration="Tmon_service_WSSoap" contract="ServicesPersos.Tmon_service_WSSoap"
                    name="RefWebLocal" />
                <endpoint address="http://www.developpez.com/adaneels/mon_service.asmx" binding="basicHttpBinding"
                    bindingConfiguration="Tmon_service_WSSoap" contract="ServicesPersos.Tmon_service_WSSoap"
                    name="RefDeveloppez" />
            </client>
    Pour utiliser l'un ou l'autre point de terminaison, passez le nom du point de terminaison souhaité en paramètre du constructeur de votre service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using (ServicesPersos.Tmon_service_WSSoap MyWS = new ServicesPersos.Tmon_service_WSSoapClient("RefWebLocal"))
    {
      // traitement 
    }
    Vous pouvez ainsi charger le service web à partir du serveur souhaité lorsque vous avez plusieurs serveurs disponibles.

    D'autres méthodologies sont disponibles en utilisant d'autres contructeurs (voir "liens utiles").

    lien utile : MSDN : constructeurs ClientBase (classe dont hérite la classe Tmon_service_WSSOAP) : http://msdn.microsoft.com/en-us/library/ms585869.aspx
    --
    Arnaud DANEELS

  7. #7
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par cyberbobby Voir le message
    Le (ou les) endpoint(s) de ton service, tu le trouve dans le fichier Web.config de ton service :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <system.serviceModel>
     <services>
       <service name="Catalogue.Service1" behaviorConfiguration="Catalogue.Service1Behavior">
     
    <!-- Service Endpoints -->
    <endpoint address="" binding="basicHttpBinding" contract="Catalogue.IService1">
    Tu peux lui donner un nom (name=""), je n'ai jamais testé ce que j'avance mais en lui donnant un nom, tu pourras utiliser le constructeur avec la remote address et la changer en fonction du service que tu désires utiliser.

    Non ?
    Je n'avais pas compris sur le moment mais au final, c'était bien ça.
    --
    Arnaud DANEELS

  8. #8
    Membre régulier Avatar de cyberbobby
    Inscrit en
    Février 2009
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 171
    Points : 106
    Points
    106
    Par défaut
    Impec ;-)

    Tu t'en sors dans ton projet ?

  9. #9
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    Citation Envoyé par cyberbobby Voir le message
    Impec ;-)

    Tu t'en sors dans ton projet ?
    ça avance ça avance
    --
    Arnaud DANEELS

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 92
    Points : 61
    Points
    61
    Par défaut
    Bonjour, une autre solution est de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BasicHttpBinding binding = new BasicHttpBinding();
    EndpointAddress address = new EndpointAddress("http://monurl:monport/monservice.asmx?wsdl");
     
    MonService.Class tes = new MonService.Class(binding, address);

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Bonjour,
    Sinon,
    la classe "MonServiceSoapClient" étant partielle, on peut définir dans un autre fichier, un autre constructeur qui prend pour paramètre l'uri.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    namespace [Namespace_du_proxy]
    {
        public partial class MonServiceSvcSoapClient : System.ServiceModel.ClientBase<Namespace_du_proxy.MonServiceSvcSoapClient>, Namespace_du_proxy.MonServiceSvcSoapClient    {
            public MonServiceSvcSoapClient(Uri endpointUrl)
            {
                this.Endpoint.Address = new System.ServiceModel.EndpointAddress(endpointUrl);
            }
        }
    }
    tout le monde est d'accord pour critiquer la pensée unique

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

Discussions similaires

  1. extraire des urls d'une page web
    Par Zorgloub dans le forum C++
    Réponses: 2
    Dernier message: 10/11/2007, 00h16
  2. Erreur lors de l'ajout d'une référence web
    Par Pilloutou dans le forum Visual Studio
    Réponses: 2
    Dernier message: 12/02/2007, 15h11
  3. [VS2005][WS]Créer une référence web dynamique
    Par virgul dans le forum Visual Studio
    Réponses: 5
    Dernier message: 24/08/2006, 16h16
  4. Lire Url d'une page web
    Par pi-2r dans le forum C++
    Réponses: 21
    Dernier message: 29/06/2006, 12h39
  5. [SOAP][Web Service] erreur création d'une référence Web
    Par Maximil ian dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 20/06/2005, 13h29

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