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 Désérialisation incomplète [Débutant]


Sujet :

Services Web

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 34
    Points : 25
    Points
    25
    Par défaut WCF Désérialisation incomplète
    Bonjour,

    Débutant en WCF, je cherche a créer un service web WCF capable de désérialiser n'importe quel document et retourner les informations dans une application de type console.

    Mon document XML pour le test est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="utf-8"?>
    <Poisson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Prenom>prenomPoisson</Prenom>
    <Espece>especePoisson</Espece>
    <Couleur>couleurPoisson</Couleur>
    </Poisson>
    Et voici le code de l'interface de mon service web :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [ServiceContract]
    public interface IService
    {
    	[OperationContract]
    	string Deserial(string fileName);
    }
    Puis le code de mon service web :
    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 class Service : IService
    {
     
    public string Deserial(string fileName)
    {
    	XmlDocument doc = new XmlDocument();
    	doc.Load(@fileName);
     
    	foreach(XmlNode e in doc.ChildNodes)
    	{
    		return " " + i.Name + " : " +i.InnerText;
    	}
     
    	return null;
    }
    }
    Comme vous pouvez vous en douter, le résultat n'est pas celui recherché puisqu'une fois le premier return effectué, la boucle foreach se stoppe, et n'affiche donc que le Prenom du poisson.

    J'aimerais donc trouver une solution, mais cela fait plusieurs jours que je cherche sans réelle avancée.

    Merci d'avance pour votre aide!

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Il est normal que la boucle foreach s'arrête, puisque tu lui passes l'instruction return. Il faudrait faire quelque chose du genre :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    XmlDocument doc = new XmlDocument();
    doc.Load(@fileName);
     
    StringBuilder sb = new StringBuilder();
     
    foreach(XmlNode e in doc.ChildNodes)
    {
        sb.Append(" " + e.Name + " : " + e.InnerText);
    }
     
    return sb.ToString();
    En résumé, dans le foreach on construit le string que l'on stocke dans le StringBuilder, et à la fin on le retourne.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup, j'avance un peu grâce a toi.
    Maintenant comment faire pour afficher dans ma console tout le contenu de mon StringBuilder sb ?

    C'est la première fois que je rencontre un "stringBuilder".

    Merci encore et d'avance pour tout !

  4. #4
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Heimerdi Voir le message
    Maintenant comment faire pour afficher dans ma console tout le contenu de mon StringBuilder sb ?

    C'est la première fois que je rencontre un "stringBuilder".
    Quand tu appelles la méthode ToString sur ton StringBuilder, tout ce que tu as stocké au sein du StringBuilder est inséré dans un String.

    Citation Envoyé par Heimerdi Voir le message
    Quand je met ce code, j'ai une erreur : La méthode doit avoir un type de retour.

    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 Deserial(string fileName)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(@fileName);
     
                StringBuilder sb = new StringBuilder();
     
                foreach(XmlNode e in doc.ChildNodes)
                {
                    sb.Append(" " + e.Name + " : " + e.InnerText);            
                }
     
                return sb.ToString();
            }
    Alors que j'ai bien mon return à la fin...
    Oui tu as bien mis le return, mais tu dois préciser le type de retour de ta méthode, comme ceci :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public string Deserial(string fileName)
    {
    }
    Ensuite pour afficher ça dans une console, il te suffit d'utiliser Console.WriteLine. Exemple :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.WriteLine(obj.Deserial(monFichier));
    Il est vraisemblable qu'en utilisant le StringBuilder, tu auras un bloc de texte, donc si tu veux améliorer l'affichage, au lieu d'utiliser un StringBuilder, tu peux utiliser une liste de string. Dans ton foreach tu ajoutes à chaque fois le string dans la liste. Ta méthode Deserial retournera donc un type IEnumerable<string> (au lieu d'un type string).

    Ensuite dans ta console, tu devras les dépiler, en faisant un nouveau foreach, au sein duquel tu appelleras Console.WriteLine afin de les afficher chacun sur une ligne :
    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
    public IEnumerable<string> Deserial(string fileName)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(@fileName);
     
        List<string> result = new List<string>();
     
        foreach(XmlNode e in doc.ChildNodes)
        {
            result.Add(" " + e.Name + " : " + e.InnerText);
        }
     
        return result;
    }
    Puis pour l'affichage :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var listOfStrings = obj.Deserial(monFichier.txt);
    foreach (var item in listOfStrings)
    {
        Console.WriteLine(item);
    }
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Quand tu appelles la méthode ToString sur ton StringBuilder, tout ce que tu as stocké au sein du StringBuilder est inséré dans un String.


    Oui tu as bien mis le return, mais tu dois préciser le type de retour de ta méthode, comme ceci :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public string Deserial(string fileName)
    {
    }
    J'ai résolu ce problème dans la seconde ou j'ai édité. Désolé... (matin, matin...).

    Par contre pour la suite, je ne comprend pas tout. Laissons la beauté de l'affichage de côté pour l'instant.

    J'ai donc référencé mon service web dans mon application console.

    J'ai donc dans mon code de l'application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ServiceReference.ServiceWCFClient mydeserial = new ServiceReference.ServiceWCFClient();
                mydeserial.Deserial(@"monChemin\monDossier\Poisson.xml");
    Que dois-je faire à présent ?

    J'ai un peu de mal... Des détails sur la mise en place sont la bienvenue.

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Il te suffit de faire :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var result = mydeserial.Deserial(@"monChemin\monDossier\Poisson.xml");    // On récupère le contenu du StringBuilder
     
    Console.WriteLine(result);    // On l'affiche
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup pour ton approche très pédagogique !

    Je vais essayer de comprendre le code pour la mise en forme !

    Et je reviens si j'ai d'autres questions !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Il est vraisemblable qu'en utilisant le StringBuilder, tu auras un bloc de texte, donc si tu veux améliorer l'affichage, au lieu d'utiliser un StringBuilder, tu peux utiliser une liste de string. Dans ton foreach tu ajoutes à chaque fois le string dans la liste. Ta méthode Deserial retournera donc un type IEnumerable<string> (au lieu d'un type string).

    Ensuite dans ta console, tu devras les dépiler, en faisant un nouveau foreach, au sein duquel tu appelleras Console.WriteLine afin de les afficher chacun sur une ligne :
    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
    public IEnumerable<string> Deserial(string fileName)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(@fileName);
     
        List<string> result = new List<string>();
     
        foreach(XmlNode e in doc.ChildNodes)
        {
            result.Add(" " + e.Name + " : " + e.InnerText);
        }
     
        return result;
    }
    Puis pour l'affichage :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var listOfStrings = obj.Deserial(monFichier.txt);
    foreach (var item in listOfStrings)
    {
        Console.WriteLine(item);
    }
    Avec mot pour mot ta méthode, cela affiche une lettre par ligne.

  9. #9
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Du coup il doit y avoir un problème lorsque tu remplis ta liste de strings. Je te conseille de mettre un point d'arrêt sur cette ligne :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    result.Add(" " + e.Name + " : " + e.InnerText);
    Et de debugger pas à pas (F5). Ca te permettra de voir le contenu des variables...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Ma référence de service n'était pas à jour...

    C'est un peu mieux à présent, il m'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xml : version="1.0" encoding="utf-8"
    Poisson : prenomPoissonespecePoissoncouleurPoisson
    Ce n'est pas encore le résultat recherché mais ça avance !

    Normalement je devais avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    xml : version="1.0" encoding="utf-8"
    Prenom : prenomPoisson
    Espece : especePoisson
    Couleur : couleurPoisson
    Une idée ?

    EDIT -
    Avec le pas à pas détaillé, je constate que mon e.InnerText se remplit avec "prenomPoissonespecePoissoncouleurPoisson".

    Je ne vois vraiment pas de solution...

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Résolu !

    Le code était le suivant :

    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 IEnumerable<string> Deserial(string fileName)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(@fileName);
     
                List<string> result = new List<string>();
     
                foreach (XmlNode e in doc.LastChild)
                {
                    result.Add("  " + e.Name + " : " + e.InnerText);
                }
     
                return result;
            }
    Ainsi il affiche mon objectif !

    Encore infiniment merci !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/12/2014, 12h23
  2. [Débutant] WCF : Erreur de désérialisation de la classe DataTable
    Par BaptisteG dans le forum C#
    Réponses: 7
    Dernier message: 02/05/2014, 12h35
  3. [Pour le Webmaster / Freedyboy] Doc pdf incomplète
    Par alncool dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 7
    Dernier message: 25/10/2005, 14h00
  4. Utilisation de join incomplète
    Par LE NEINDRE dans le forum Langage
    Réponses: 8
    Dernier message: 13/10/2005, 15h33
  5. Installation du FULLTEXT incomplète ?
    Par Vow dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/02/2005, 09h51

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