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 :

Exposer son service avec deux endpoint : basicHttpBinding et webHttpBinding


Sujet :

Windows Communication Foundation .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Exposer son service avec deux endpoint : basicHttpBinding et webHttpBinding
    Bonjour,

    Désolée de créer un énième topic (promis, c'est le dernier) mais j'ai encore un problème qui me géne.

    Comme je l'ai évoqué dans mon précédent topic, je souhaite créer un Service WCF qui est exposé via basicHttpBinding en https. Au niveau de l'authentification, j'utilise UserNamePasswordValidator. Tout cela fonctionne parfaitement.

    Désormais, je souhaiterais exposer mon service sur un second point de terminaison en WebHttpBinding. Après avoir trouvé quelques tutoriaux sur le net, j'ai commencé la modification de mon Web.Config.

    J'ai ajouté un EndPoints :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <endpoint address="SOAP"
                      binding="basicHttpBinding"
                      contract="MonService.ServiceContract.IMonServiceWCF"
                      bindingConfiguration="soapBinding" />
            <endpoint address="REST"
                      binding="webHttpBinding"
                      contract="MonService.ServiceContract.IMonServiceWCF"
                      behaviorConfiguration="PoxBehavior"
                      bindingConfiguration="webBinding" />
    Un binding :

    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
    <bindings>
          <basicHttpBinding>
            <binding name="soapBinding" >
              <security mode="TransportWithMessageCredential"  >
                <transport clientCredentialType="Basic" />
              </security>
            </binding>
          </basicHttpBinding>
     
          <webHttpBinding>
            <binding name="webBinding">
              <security mode="Transport" >
              </security>
            </binding>
          </webHttpBinding>
        </bindings>
    Et un Endpoint Behavior :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <endpointBehaviors>
            <behavior name="PoxBehavior">
              <webHttp />
            </behavior>
          </endpointBehaviors>
    Au final, je voudrais proposer le service en SOAP, en Pox et en JSON. Pour l'instant, on va faire SOAP (déjà fais) et Pox.

    A ce stade, mon Web.Config ressemble à ça :

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    <?xml version="1.0"?>
     
    <configuration>
     
      <system.web>
        <customErrors mode="Off"/>
      </system.web>
     
      <connectionStrings>
        <add name="MesEntities" connectionString="ma chaine de connexion" />
      </connectionStrings>
     
      <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
        <services>
          <service name="MonService.WCFService.MonServiceWCF" behaviorConfiguration="MetadataWSDL">
            <host>
              <baseAddresses>
                <add baseAddress="https://localhost"/>
              </baseAddresses>
            </host>
            <endpoint address="SOAP"
                      binding="basicHttpBinding"
                      contract="MonService.ServiceContract.IMonServiceWCF"
                      bindingConfiguration="soapBinding" />
            <endpoint address="REST"
                      binding="webHttpBinding"
                      contract="MonService.ServiceContract.IMonServiceWCF"
                      behaviorConfiguration="PoxBehavior"
                      bindingConfiguration="webBinding" />
     
          </service>
        </services>
     
        <bindings>
          <basicHttpBinding>
            <binding name="soapBinding" >
              <security mode="TransportWithMessageCredential"  >
                <transport clientCredentialType="Basic" />
              </security>
            </binding>
          </basicHttpBinding>
     
          <webHttpBinding>
            <binding name="webBinding">
              <security mode="Transport" >
              </security>
            </binding>
          </webHttpBinding>
        </bindings>
     
        <behaviors>
          <endpointBehaviors>
            <behavior name="PoxBehavior">
              <webHttp />
            </behavior>
          </endpointBehaviors>
          <serviceBehaviors>
            <behavior name="MetadataWSDL">
              <serviceCredentials>
                <userNameAuthentication customUserNamePasswordValidatorType="MonService.WCFService.CustomUserNameValidator, MonService.WCFService" userNamePasswordValidationMode="Custom" />
              </serviceCredentials>
              <serviceMetadata httpsGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true" />
              <dataContractSerializer maxItemsInObjectGraph="6553600"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
     
      </system.serviceModel>
     
    </configuration>
    Ps : Si vous voyez un truc pas bon dans mon fichier de configuration, merci de me le dire.

    J'ai créé une nouvelle méthode sur mon service :

    Interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [WebGet(UriTemplate = "date/{year}/{month}/{day}", ResponseFormat = WebMessageFormat.Xml)]
            [OperationContract()]
            string GetDate(string day, string month, string year);
    Implémentation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public string GetDate(string day, string month, string year)
            {
                return new DateTime(Convert.ToInt32(year), Convert.ToInt32(month), Convert.ToInt32(day)).ToString("dddd, MMMM dd, yyyy");
            }
    Avec mon navigateur, si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    https://monserveur/MonServiceWCF.svc/REST/date/1995/10/10
    J'ai bien ceci qui s'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">mardi, octobre 10, 1995</string>
    Ca semble fonctionner donc.

    Le problème vient de mon client WPF. Désormais, j'ai un avertissement qui apparait :

    Custom tool warning: The following Policy Assertions were not Imported:
    XPath://wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WebHttpBinding_IMonServiceWCF']
    Assertions:
    <sp:HttpsToken xmlns:sp='http://schemas.xmlsoap.org/ws/2005/07/securitypolicy'>..</sp:HttpsToken>
    C:\MonServiceClientWPF\Service References\MonServiceReference\Reference.svcmap
    Et si je tente quand meme de lancer l'application, j'intercépte une exception :

    Une section de configuration du point de terminaison du contrat "MonServiceReference.IMonServiceWCF" n'a pas pu être chargée car plusieurs configurations de point de terminaison pour ce contract ont été détectées. Indiquez la section de configuration du point de terminaison préférée par son nom.
    D'aprés ce que j'en comprends, il est un peu perdu à cause des deux endpoints et il faut lui indiquer lequel on veut utiliser. Bien ça ? Le problème, c'est que je vois pas comment faire ça en C#.

    Je précise que pour utiliser mon service dans mon application WPF, j'ai utilisé le générateur auto de Visual Studio en faisant "Add Service Reference" dans le projet.

    Merci encore pour votre aide.
    Dernière modification par Deepin ; 02/02/2010 à 11h29. Motif: Balises [QUOTE]...[/QUOTE] au lieu de [CODE]...[/CODE]

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je vais m'auto-répondre.

    En fait, lors de la création de l'instance du service en C#, il faut précisier le endpoint directement comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client = new MonServiceClientWPF.MonServiceReference.MonServiceWCFClient("BasicHttpBinding_IMonServiceWCF");
    Et tout fonctionne parfaitement

    Je profite du topic pour poser une question qui me travaille depuis quelques jours et qui concerne l'exposition des métadonnées. Actuellement, j'ai un ServiceBehavior dans lequel je précise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <serviceMetadata httpsGetEnabled="true"/>
    Ainsi, j'ai bien mes métadonnées qui sont exposées au format WSDL.

    Cependant, je vois beaucoup d'exemple utilisant un endPoint de type mexHttpBinding avec en contract IMetadataExchange. Pour moi, cette façon de procéder était totalement différence du WSDL. En gros, soit on faisait en WSDL, soit en MEX.

    Mais j'ai vu une personne dire ceci :

    Le WSDL peut être obtenu en ajoutant un endpoint avec le contrat IMetadataExchange et le binding mexhttpbinding
    Alors finalement, on peut obtenir le WSDL avec mexHttpBinding ? Si oui, quel est l'avantage / inconvénient de cette méthode plutôt que de passer par un ServiceBehavior dans lequel on indique httpsGetEnabled="true" ?

    Merci.
    Dernière modification par Invité ; 02/02/2010 à 13h45.

  3. #3
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Citation Envoyé par Sookie Voir le message
    Alors finalement, on peut obtenir le WSDL avec mexHttpBinding ? Si oui, quel est l'avantage / inconvénient de cette méthode plutôt que de passer par un ServiceBehavior dans lequel on indique httpsGetEnabled="true" ?
    C'est une bonne question, dont je suis curieux de connaitre la réponse. Mais je te propose de la poser dans un nouveau sujet, sinon tu auras peu de chance d'avoir une réponse.

    Tu peux en profiter pour mettre ce sujet en

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Skalp Voir le message
    C'est une bonne question, dont je suis curieux de connaitre la réponse. Mais je te propose de la poser dans un nouveau sujet, sinon tu auras peu de chance d'avoir une réponse.

    Tu peux en profiter pour mettre ce sujet en
    Oui, bonne idée, ça sera plus clair.
    Dernière modification par Skalp ; 04/02/2010 à 13h54.

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

Discussions similaires

  1. Exposer un Service CRUD RestFul avec JBoss RestEasy
    Par dgouyette dans le forum REST
    Réponses: 11
    Dernier message: 23/09/2014, 22h47
  2. [Article] Exposer un Service CRUD RestFul avec Jboss RestEasy
    Par dgouyette dans le forum Services Web
    Réponses: 0
    Dernier message: 20/05/2009, 00h15
  3. [Article] Exposer un Service CRUD RestFul avec Jboss RestEasy
    Par dgouyette dans le forum Wildfly/JBoss
    Réponses: 0
    Dernier message: 20/05/2009, 00h15
  4. problème pour gérer le son avec deux forms
    Par huntermaster dans le forum Composants VCL
    Réponses: 9
    Dernier message: 04/03/2009, 08h52
  5. SQL Server 2005 : Mettre en forme son rapport avec Reporting Services
    Par Fleur-Anne.Blain dans le forum Contribuez
    Réponses: 0
    Dernier message: 01/02/2009, 10h55

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