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 :

[VS2008SP1][.NET 3.5][C#]Récupération d'un tableau d'élément depuis un WebServices


Sujet :

Services Web

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de agueffier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 93
    Par défaut [VS2008SP1][.NET 3.5][C#]Récupération d'un tableau d'élément depuis un WebServices
    Bonjour,

    Je travaille sur un WebService dans lequel l'une des méthodes me retourne un tableau d'objet.
    Lorsque ce tableau est un tableau de chaine (string[]) pas de problème, je récupère tous mes éléments, mais lorsqu'il s'agit d'un type personnalisé (myObject[]) je ne récupère que le premier élément et pas les autres, alors que dans le flux XML, je vois bien tous mes éléments...
    J'avoue un peu mon désarroi devant ce comportement. Déjà qu'il me faut modifier les classes générées à chaque fois que je rafraichis le WS (tous mes types perso deviennent des System.Data.DataSet !!), je pensais qu'il suffisait de modifier les types. Mais a priori cela ne suffit pas.

    Je fais donc appel à vos connaissances.

    D'avance merci

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bonjour

    Etonnant ce que tu décrits (qui est pourtant très très classique). Peux tu poster la signature de tes méthodes ?

  3. #3
    Membre éprouvé Avatar de agueffier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 93
    Par défaut
    Bonjour BlueDeep,

    Alors ci dessous le source du type personnalisé :
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Serialization;
     
    namespace ICS_Core_Objects_Library
    {
        public class DimensionDescriptor : IXmlSerializable
        {
            private string _code;
            private string _description;
     
            public DimensionDescriptor():this(string.Empty, string.Empty)
            {
            }
     
            public DimensionDescriptor(string code, string description)
            {
                this._code = code;
                this._description = description;
            }
     
            public string Code
            {
                get { return this._code; }
            }
     
            public string Description
            {
                get { return this._description; }
            }
     
            #region IXmlSerializable Members
     
            public System.Xml.Schema.XmlSchema GetSchema()
            {
                return null;
            }
     
            public void ReadXml(XmlReader reader)
            {
                if (!reader.Read())
                    return;
     
                this._code = reader.ReadElementString("code");
                this._description = reader.ReadElementString("description");
            }
     
            public void WriteXml(XmlWriter writer)
            {
                writer.WriteElementString("code", this._code);
                writer.WriteElementString("description", this._description);
            }
     
            #endregion
        }
    }
    Ci après la signature de la méthodes du WebServices :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            [WebMethod(true)]
            public DimensionDescriptor[] GetDimensionList()
            {
                List<DimensionDescriptor> DimensionList = new List<DimensionDescriptor>();
     
                DimensionList.Add(new DimensionDescriptor("CompanyGroup", "Entité juridique"));
                DimensionList.Add(new DimensionDescriptor("Company", "Entité organisationnelle"));
                DimensionList.Add(new DimensionDescriptor("ParentAccounts", "Groupe de compte"));
                DimensionList.Add(new DimensionDescriptor("Account", "Compte"));
     
                return DimensionList.ToArray();
            }
    Enfin, un extrait du code de référence généré et corrigé par mes soins (le fameux System.Data.DataSet[] en lieu et place de mon ICS_Core_Objects_Library.DimensionDescriptor[]
    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
     
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
        [System.ServiceModel.MessageContractAttribute(WrapperName="GetDimensionList", WrapperNamespace="http://tempuri.org/", IsWrapped=true)]
        public partial class GetDimensionListRequest {
     
            public GetDimensionListRequest() {
            }
        }
     
        [System.Diagnostics.DebuggerStepThroughAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
        [System.ServiceModel.MessageContractAttribute(WrapperName="GetDimensionListResponse", WrapperNamespace="http://tempuri.org/", IsWrapped=true)]
        public partial class GetDimensionListResponse {
     
            [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://tempuri.org/", Order=0)]
            [System.Xml.Serialization.XmlArrayItemAttribute("DimensionDescriptor")]
            public ICS_Core_Objects_Library.DimensionDescriptor[] GetDimensionListResult;
     
            public GetDimensionListResponse() {
            }
     
            public GetDimensionListResponse(ICS_Core_Objects_Library.DimensionDescriptor[] GetDimensionListResult)
            {
                this.GetDimensionListResult = GetDimensionListResult;
            }
        }
    et enfin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            public ICS_Core_Objects_Library.DimensionDescriptor[] GetDimensionList() {
                ICS_Excel_Reporter.ICSReporter.GetDimensionListRequest inValue = new ICS_Excel_Reporter.ICSReporter.GetDimensionListRequest();
                ICS_Excel_Reporter.ICSReporter.GetDimensionListResponse retVal = ((ICS_Excel_Reporter.ICSReporter.ICSReporterSoap)(this)).GetDimensionList(inValue);
                return retVal.GetDimensionListResult;
            }
    Donc à première vue, tout est beau... sauf que je vois que le premier élément de mon tableau... alors que le XML est correct lui

    Alors, c'est grave docteur ?

    D'avance merci

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Oui, apparemment rien que du très classique (juste un détail mais sans importance : tu peux garder les types de retour des webmethods sous forme de liste, elles seront traduites en tableaux de toute manière).

    Sinon, pourquoi implémentes tu une sérialisation spécifique de tes objets métiers plutôt que laisser faire la sérialisation soap/xml standard ? (totalement inutile ici, AMHA).

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 4
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Oui, apparemment rien que du très classique (juste un détail mais sans importance : tu peux garder les types de retour des webmethods sous forme de liste, elles seront traduites en tableaux de toute manière).

    Sinon, pourquoi implémentes tu une sérialisation spécifique de tes objets métiers plutôt que laisser faire la sérialisation soap/xml standard ? (totalement inutile ici, AMHA).

    Bonjour

    J'ai le même soucis pour récupèrer des tableaux depuis un web services et j'aimerai connaitre la solution à utilisée afin de ne pas à développer la serialisation XML ?

    Merci

  6. #6
    Membre éprouvé Avatar de agueffier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 93
    Par défaut
    Je ne peux pas te répondre dans la mesure où j'ai conservé la sérialisation XML car j'en fais un autre usage par ailleurs.


  7. #7
    Membre éprouvé Avatar de agueffier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 93
    Par défaut
    1. Pourquoi n'ai je point garder l'objet List<DimensionDescriptor>... et bien parce qu'à la fin je me suis dit que c'était là que ça déconnait... mais au final, non.

    2. Pourquoi implémenter IXmlSerializable ? Ben parce que sinon ça plante... il me dit qu'il veut pas ... En même temps, avec tous ces tests en parallèle (ben ouais je bosse sur 2 autres livrables en même temps... classique non ? )... je refais un test et reviens vous dire si sans ce IXmlSerializable maison, cela marche pas mieux...

  8. #8
    Membre éprouvé Avatar de agueffier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 93
    Par défaut
    Argh ! J'ai retrouvé pourquoi j'ai implémenté un IXmlSerializable...

    1. Mes propriétés sont en lecture seule et donc il semble qu'il ne les détecte pas
    2. Mon objet contient par ailleurs des méthodes (non visibles dans le code mis en ligne) et il faut donc que j'utilise la classe DimensionDescriptor (qui est dans une DLL à part et partagé par le WebServices et le client WinForm) et pas celle qui est sinon généré dans le proxy du WebService. Or si pas de IXmlSerializable le zozo me génère systématiquement la classe proxy...

    Existe-t'il un moyen de le leurrer ?

  9. #9
    Membre éprouvé Avatar de agueffier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 93
    Par défaut
    Cette fois, je tiens la solution... enfin, je ne sais pas si c'est LA solution, mais elle a le mérite de fonctionner et de fonctionner suivant mes besoins.

    Le temps de mettre tout cela au propre (donc d'enlever les centaines de lignes en commentaire) et demain matin je solde le sujet en y collant cette solution.

    En tout cas, merci BlueDeep pour tes conseils, cela m'a permis de reprendre le problème sous le bon angle

  10. #10
    Membre éprouvé Avatar de agueffier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    93
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 93
    Par défaut
    Alors la solution est :
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Serialization;
     
    namespace ICS_Core_Objects_Library
    {
        public class DimensionDescriptor : IXmlSerializable
        {
            private string _code;
            private string _description;
     
            public DimensionDescriptor():this(string.Empty, string.Empty)
            {
            }
     
            public DimensionDescriptor(string code, string description)
            {
                this._code = code;
                this._description = description;
            }
     
            public string Code
            {
                get { return this._code; }
            }
     
            public string Description
            {
                get { return this._description; }
            }
     
            #region IXmlSerializable Members
     
            public System.Xml.Schema.XmlSchema GetSchema()
            {
                return null;
            }
     
            public void ReadXml(XmlReader reader)
            {
                reader.ReadStartElement();
                reader.MoveToContent();
                this._code = reader.ReadElementString("code");
                this._description = reader.ReadElementString("description");
                reader.MoveToContent();
                reader.ReadEndElement();
            }
     
            public void WriteXml(XmlWriter writer)
            {
                writer.WriteElementString("code", this._code);
                writer.WriteElementString("description", this._description);
            }
     
            #endregion
        }
    }
    En fait tout est dans ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            public void ReadXml(XmlReader reader)
            {
                reader.ReadStartElement();
                reader.MoveToContent();
                this._code = reader.ReadElementString("code");
                this._description = reader.ReadElementString("description");
                reader.MoveToContent();
                reader.ReadEndElement();
            }
    Et hop le tour est joué... maintenant je vous laisse jouer pour la gestion des namespaces et des XML schémas associés

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

Discussions similaires

  1. [VB NET][C#][dll] echec récupération classe com
    Par estacado dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 04/03/2010, 14h51
  2. Réponses: 7
    Dernier message: 12/02/2008, 13h20
  3. Réponses: 3
    Dernier message: 22/10/2007, 13h07
  4. Réponses: 6
    Dernier message: 05/10/2006, 17h04
  5. Réponses: 8
    Dernier message: 30/04/2006, 15h42

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