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 :

[WCF] XmlSerializer avec json endpoint


Sujet :

Services Web

  1. #1
    Membre éclairé Avatar de roots_man
    Inscrit en
    Août 2004
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 328
    Par défaut [WCF] XmlSerializer avec json endpoint
    Bonjour,

    Je suis actuellement confronté à un problème dans le cadre de la mise en place d'un service WCF. Ce service possède 3 endpoints avec behavior
    • Json : <enableWebScript />
    • Xml : <webHttp />
    • Soap : Aucun behavior


    Si j'utilise le DataContractSerializer ( serializer par default) avec mon service, il n'y a aucun problème. Les données sont retourné correctement en json et en xml.

    Maintenant mon problème est le suivant : Avec le DataContractSerializer, je n'ai aucun controle sur la sortie de mon fichier xml (il met toutes mes données dans des element xml) ! Ce que je souhaite, c'est pouvoir mettre certaine données en attribut. Pour ce faire, j'ai alors décider de passer au XmlSerializer et d'utiliser XmlAttribute sur mes DataMember.

    Cela fonctionne correctement et j'obtient maintenant des attributs en sortie de mon xml. MAIS, je suis obligé de désactivé le endpoint json car il ne supporte pas le XmlSerializer.

    Erreur :
    System.InvalidOperationException: Endpoints using 'XmlSerializerFormatAttribute' cannot be used with 'System.ServiceModel.Description.WebScriptEnablingBehavior'.
    J'aimerais savoir comment je pourrais faire fonctionner mes 2 endpoints (json+xml) en utilisant XmlSerializer ??

    Merci d'avance pour vos réponses.

  2. #2
    Membre éclairé Avatar de roots_man
    Inscrit en
    Août 2004
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 328
    Par défaut
    Je suis toujours a la recherche d'une solution. J'ai pensé peut être faire 2 serviceContract
    • [ServiceContract][XmlSerializerFormat]
    • [ServiceContract][DataContractFormat]

    Et ensuite rediriger mes 2 endpoint sur chaque ServiceContract ! Cela fonctionne mais j'ai un problème, je n'arrive pas a faire appel à la même méthode (OperationContract) depuis chaque ServiceContract. J'ai ensuite ma classe qui implémente mes 2 interfaces(ServiceContract) avec à l'intérieur le détail de mes méthodes.

    Est-ce que quelqu'un sait si c'est possible d'appeler la même méthode depuis 2 ServiceContract différents ??

    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
    [ServiceContract]
    [XmlSerializerFormat]
    public interface IContract1
    {
        [OperationContract]
        string maMethod();
    }
     
    [ServiceContract]
    [DataContractFormat]
    public interface IContract2
    {
        [OperationContract]
        string maMethod();
    }
    Cela me retourne l'erreur suivante lors du lancement du service. (A savoir que si la métode est utilisée par une seule interface, le service tourne parfaitement !
    Failed to add a service. Service metadata may not be accessible. Make sure your service is running and exposing metadata.

    Error: Cannot obtain Metadata from http://xxxxx:nn/blabla?wsdl

    If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address. For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455.

    WS-Metadata Exchange Error
    URI: http://xxxxx:nn/blabla?wsdl

    Metadata contains a reference that cannot be resolved: 'http://xxxxx:nn/blabla?wsdl'.
    Merci encore pour votre aide !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Pour la question initiale je n'ai pas de réponse mais ton idée dans le deuxième post me semble une solution probable pour résoudre ton problème.

    Pour ce qui concerne les noms des méthodes, as-tu pensé à jouer sur les noms des méthodes en assignant des valeurs différents sur la propriétés Name de chaque OperationContract pour qu'au final un truc du genre :
    Code C# : 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
     
    [ServiceContract]
        [XmlSerializerFormat]
        public interface IContract1
        {
            [OperationContract(Name="bla1")]
            string maMethod();
        }
     
        [ServiceContract]
        [DataContractFormat]
        public interface IContract2
        {
            [OperationContract(Name="bla2")]
            string maMethod();
        }

    je n'ai pas testé.

  4. #4
    Membre éclairé Avatar de roots_man
    Inscrit en
    Août 2004
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 328
    Par défaut
    Ouais ok ca fonctionne... (j'avais essayer déja ca hier et il me semble que ca fonctionnait pas, bref)...

    Mais le problème maintenant c'est que l'appel aux fonction se fait de cette manière

    Alors que j'aimerais que ca soit le endpoint (json / xml) qui fasse la différence et que le nom de la méthode reste la meme.

    Je ne sais pas si cela est possible mais en tous les cas merci d'avance encore pour votre aide!

  5. #5
    Membre éclairé Avatar de roots_man
    Inscrit en
    Août 2004
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 328
    Par défaut
    Voila c'est bon j'ai trouvé. Il suffit de spécifier un namespace différent pour chaque ServiceContract !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [ServiceContract(Namespace = "myNamespace1")]
    [ServiceContract(Namespace = "myNamespace2")]

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par roots_man Voir le message
    Voila c'est bon j'ai trouvé. Il suffit de spécifier un namespace différent pour chaque ServiceContract !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [ServiceContract(Namespace = "myNamespace1")]
    [ServiceContract(Namespace = "myNamespace2")]
    Cool. C'est noté. Merci d'avoir partagé la solution.

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

Discussions similaires

  1. WCF, authentification avec Membership
    Par Poulain dans le forum Windows Communication Foundation
    Réponses: 8
    Dernier message: 04/04/2011, 11h12
  2. [AJAX] Encodage avec JSON
    Par Norin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/07/2008, 22h02
  3. WCF probléme avec la serialisation de ObservableCollection
    Par amandinerenard dans le forum Windows Communication Foundation
    Réponses: 1
    Dernier message: 13/03/2008, 00h45
  4. WCF - Problème avec les DataContract
    Par ophalia dans le forum Windows Communication Foundation
    Réponses: 3
    Dernier message: 07/10/2007, 20h03
  5. [3.0] [Service Wcf] problème avec le fichier .svc
    Par marc_dd dans le forum Windows Communication Foundation
    Réponses: 1
    Dernier message: 14/08/2007, 17h21

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