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 :

Pb de serialisation d'un objet métier avant traitement par une web method


Sujet :

Services Web

  1. #1
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut Pb de serialisation d'un objet métier avant traitement par une web method
    Salut,

    Je voudrais présenter un web service pouvant accepter n'importe quel objet. Cela parce qu'il est destiné à plusieurs client qui utilisent différents formats de données et différentes méthodes pour les envoyer.
    Quel que soit les données qui arrivent elles sont sensées mettre un stock à jour.
    Le comportement de l'application serait modifié en fonction d'un paramètre de type chaine "clientName".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [WebMethod]
    public string HelloWorld(object obj, string clientName)
    Le but étant de ne pas avoir à développer 36 web services.

    Ca compile, mais ne marche pas vraiment. Je n'ai que le protocole SOAP1.1 ou 1.2. Est-ce normal, quel en est la raison?
    Deplus, j'ai une erreur à l'execution
    Erreur lors de la génération du document XML.
    Bon, j'ajoute des détails:
    La web method pour le test elle renvoi juste "done"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            [WebMethod]
            public string HelloWorld(object obj, string clientName)
            {
                return "done";
            }
    La procedure qui fait appel au web service
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private static void MaProc1()
    {
        Obj1 obj = new Obj1();
        obj.ProId = 1;
        obj.Nom = "toto";
        Service1 srv = new Service1();srv.HelloWorld(obj, "toto");
    }
    La classe Obj1
    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
    namespace Immobilis.EComm.BO
    {
        [Serializable]
        public class Obj1
        {
            private int _proId;
     
            public int ProId
            {
                get { return _proId; }
                set { _proId = value; }
            }
     
            private string _nom;
     
            public string Nom
            {
                get { return _nom; }
                set { _nom = value; }
            }
     
        }
    }
    Et pour finir, la trace
    System.InvalidOperationException was unhandled
    Message="Erreur lors de la génération du document XML."
    Source="System.Xml"
    StackTrace:
    à System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id)
    à System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle)
    à System.Web.Services.Protocols.SoapHttpClientProtocol.Serialize(SoapClientMessage message)
    à System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
    à ConsoleApplication1.localhost.Service1.HelloWorld(Object obj, String clientName) dans C:\Users\Julien\Documents\Visual Studio 2005\Projects\Solution2\ConsoleApplication1\Web References\localhost\Reference.cs:ligne 78
    à ConsoleApplication1.Program.MaProc1() dans C:\Users\Julien\Documents\Visual Studio 2005\Projects\Solution2\ConsoleApplication1\Program.cs:ligne 53
    à ConsoleApplication1.Program.Main(String[] args) dans C:\Users\Julien\Documents\Visual Studio 2005\Projects\Solution2\ConsoleApplication1\Program.cs:ligne 26
    à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
    à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    à System.Threading.ThreadHelper.ThreadStart()
    A+

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 646
    Points
    1 646
    Par défaut
    tu as généré le client?

  3. #3
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    Citation Envoyé par rattlehead Voir le message
    tu as généré le client?

    Est-ce que ça compile? Oui.
    Il faut que je trouve où ça coince. J'ai du oublier qqch parce que je l'ai fait au boulot et ça a marché.

    Ben en fait ça marche pour des types Int32 ou String mais pas pour une classe que je créé.

    Est-ce que ajouter l'attibu [Serializable] suffit?
    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
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Xml;
    using System.Xml.Serialization;
     
    namespace Immobilis.EComm.BO
    {
        [Serializable]
        [XmlRootAttribute]
        public class Obj1
        {
            private int _proId;
     
            [XmlElement]
            public int ProId
            {
                get { return _proId; }
                set { _proId = value; }
            }
     
            private string _nom;
     
            [XmlElement]
            public string Nom
            {
                get { return _nom; }
                set { _nom = value; }
            }
     
        }
    }
    Si j'execute ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Obj1 obj = new Obj1();
    obj.ProId = 1;
    obj.Nom = "toto";
     
    XmlSerializer ser = new XmlSerializer(typeof(Obj1));
    TextWriter writer = new StreamWriter(@"test.xml");
    ser.Serialize(writer, obj);
    Cela produit le fichier Xml suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="utf-8"?>
    <Obj1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <ProId>1</ProId>
      <Nom>toto</Nom>
    </Obj1>
    La serialization fonctionne, mais ne passe pas dans le webservice.
    A+

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Points : 1 646
    Points
    1 646
    Par défaut
    il y a peut etre la réponse ici
    http://www.developpez.net/forums/sho...d.php?t=192115

    j'avais eu le même problème quand j'avais fait un webservice du coup j'avais tout mis en string dans ma webmethod. j'etais un peu novice et depuis je n'ai pas refait de web service.

  5. #5
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    En fait, la web methode fonctionne avec un Type du FrameWork. Pour pouvoir envoyer tout autre objet, il faut ajouter l'attribut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [XmlInclude(typeof(Obj1))]
    à la méthode pour que cela fonctionne.

    Merci à tous.

    A+

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/04/2013, 16h45
  2. question sur formation avant embauche par une SSII
    Par gueulederack dans le forum SSII
    Réponses: 9
    Dernier message: 26/01/2012, 15h44
  3. Encodage d'objet serialisé pour passer par une requete HTTP
    Par CocoLeNain dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 03/06/2010, 17h32
  4. objet "this" mis à jour par une méthode sans raison
    Par Macomoul dans le forum Langage
    Réponses: 8
    Dernier message: 03/02/2008, 17h11
  5. Réponses: 2
    Dernier message: 08/02/2007, 10h20

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