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 :

Methodes exposees en REST et SOAP


Sujet :

Windows Communication Foundation .NET

  1. #1
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut Methodes exposees en REST et SOAP
    Bonjour,

    J'ai pris parti d'exposer mes services en rest et en soap afin d'etre accessible avec le plus grans nombre de techno

    Javascript, Php et les asp 3.0 classic utlisent REST
    JSP / Java, asp.net, c#.net utilisent SOAP.

    Afin que les langages utilisant REST puissent bien fonctionner il a fallu que je change le type de tous mes parametres de methodes en type string:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Client getClientById(int id) --> Client getClientById(string id)
    Ce qui me gene c'est que lorsque j'utilisent ces meme methodes en ASP.Net par exemple et bien je suis gené de devoir passer que des string, y a t il une facon de faire ?


    Merci à vous.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Dans les exemples fournis sur cette page, on voit bien qu'il possible de passer des entiers et pas des strings.

    Donc je me demande quelle est l'erreur qui t'a poussé à utiliser que des strings ?

  3. #3
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    Dans toutes les docs que j'ai vu et lorsque je mets des type autre que string, a l'execution on me signal que je dois mettre que des type strings entant que parametres.

    Variables for UriTemplate path segments must have type 'string'

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par topolino Voir le message
    Variables for UriTemplate path segments must have type 'string'
    T'as peut-être raison et aussi peut-être que c'est le site MSDN qui n'est pas à jour

  5. #5
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    Du coup faut il surcharger toutes les methodes a ton avis ?

    Je cherche une solution.

    EN plus que dois je faire de mes parametres de type out ? car j'en ai pas besoin en REST mais je veux les garder quand je suis en SOAP.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ouais du coup, il faut utiliser des strings dans toutes les méthodes !

    Cette modification est moins coûteuse que de se mettre à créer un contrat spécifique pour les connexions REST

  7. #7
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    Tu sais s'il y a moyen de donner acces a certaines methodes en fonction du binding ? car en .net par exemple lorsque je vais faire une reference aux service SOAP il va me generer automatiquement un proxy et je ne voudrais pas y voir les methodes surchargées avec les parametres de type string, mais donner acces qu'aux methodes avec les bon type (int, out.....)

  8. #8
    Invité
    Invité(e)
    Par défaut
    En parlant de surcharge sais-tu que cela est impossible dans WCF à moins que tes méthodes surchargées aient des valeurs uniques pour l'attribut Name dans leur attribut OperationContract

    Pour revenir à ta question : impossible de restreindre la génération côté client de certaines opérations de service.
    La solution à ton problème est de faire comme suit :
    - Avoir un contrat spécifique à REST RestContract : toutes les méthodes ont des paramètres de type string
    - Avoir un contrat normal NormalContract : toutes les méthodes ont des paramètres avec des types corrects
    - Avoir un service qui implémente ces deux contrats
    - Dans le service tu implémentes les méthodes de NormalContract
    - Dans l'implémentation des méthodes de RestContract tu fais appel aux méthodes implémentées de NormalContract en prenant soin de bien parser les string en type correct

  9. #9
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    Pour etre certain de bien avoir compris:
    Ca ressemblerait à ca

    Interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public interface IClients_RestContract
    {
            [OperationContract]
            [WebGet(UriTemplate = "clients/{agentId}", ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
            string[] GetClientsBycountryId(string countryId);
    }
     
    public interface IClients_NormalContract
    {
            [OperationContract]
            [WebGet(UriTemplate = "clients/{agentId}", ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
            string[] GetClientsBycountryId(int countryId);
    }
    Services
    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
     
    public partial class ExposedService : IClients_RestContract, IClients_NormalContract
    {
     public string[] GetClientsByCountryId(string agentId)
    {
    	//... code
    	int Id = Convert.ToInt32(agentId);
    	GetClientsByCountryId(int agentId)
    }
     
    public string[] GetClientsByCountryId(int agentId)
    {
    	//... code
    	//Call couche metier
    }
    }
    Par contre je ne change rien au niveau du web.config ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Ok! c'est ça !

  11. #11
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    J'ai l'erreur suivante:

    contract: http://tempuri.org/:IClientsRest ----> System.InvalidOperationException: The SMART.WCFInterface.IClientsRest.GetClientsBycountryId operation references a message element [http://tempuri.org/:GetClientsBycountryId] that has already been exported from the SMART.WCFInterface.IClients.GetClientsBycountryId operation. You can change the name of one of the operations by changing the method name or using the Name property of OperationContractAttribute. Alternatively, you can control the element name in greater detail using the MessageContract programming model.



    Ah mon avis ce n'est pas possible.

  12. #12
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    Ok je n'ai plus d'erreur dans mon web.config j'avais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <endpoint address="soap" binding="basicHttpBinding" contract="SMART.WCFInterface.IClientsRest"/><!--SOAP-->
            <endpoint address="rest" behaviorConfiguration="restBehavior" binding="webHttpBinding" contract="SMART.WCFInterface.IClientsRest"/>
    Car je pensais mettre a disposition une interfaceRest pour webHttpBinding et une interfaceSoap pour basicHttpBinding.

    Car quand j utilise le service via .net il me mets a dispo que l'interface REst non l 'autre

  13. #13
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    Voila un article qui reponds a toutes mes questions.
    Vous en pensez quoi ?

  14. #14
    Invité
    Invité(e)
    Par défaut
    Au fait j'ai oublié de te dire que pour que ton code marche il faut que tu donnes des valeurs à la propriété Namespace différent dans l'attribut ServiceContract de chacun de tes contrats.

  15. #15
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    AH bon ?

    Je vais le refaire alors, car j'avais tout effacé. Mais concernant les endPoint je peux mettre les differentes interfaces ? Une avec IClient et l'autre IClientRest ?

    que penses tu de l'articles ?

  16. #16
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par topolino Voir le message
    Je vais le refaire alors, car j'avais tout effacé. Mais concernant les endPoint je peux mettre les differentes interfaces ? Une avec IClient et l'autre IClientRest ?
    Ok, il te faut deux endpoints.

    Citation Envoyé par topolino Voir le message
    que penses tu de l'articles ?
    je l'ai pas encore lu. Surtout que t'as pas mis le lien de l'article.

  17. #17
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    Le lien: http://www.codemeit.com/wcf/wcf-rest...p-coexist.html

    Le seul probleme c'est l'absence de UriTemplate. Dommage car je pour ma part je voudrais utiliser la Method Post pour certaine operations.

Discussions similaires

  1. Scanner de requête REST et SOAP
    Par flolebreton dans le forum Services Web
    Réponses: 1
    Dernier message: 28/03/2013, 02h34
  2. Configuration Rest et Soap
    Par topolino dans le forum Windows Communication Foundation
    Réponses: 2
    Dernier message: 02/03/2011, 10h01
  3. [Aide] Service web RESt et SOAP
    Par brixou dans le forum Services Web
    Réponses: 0
    Dernier message: 22/02/2011, 11h11
  4. [SQL-C#-PHP : SOAP] complexité des methodes C#
    Par rudylar dans le forum Services Web
    Réponses: 1
    Dernier message: 04/07/2008, 19h16
  5. [SQL-C#-PHP : SOAP] complexité des methodes C#
    Par rudylar dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 04/07/2008, 14h10

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