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

C# Discussion :

WCF : Erreur de désérialisation de la classe DataTable [Débutant]


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut WCF : Erreur de désérialisation de la classe DataTable
    Bonjour,

    Je développe actuellement une application client/serveur très simple pour échanger des données via le modèle WCF sous Visual C# 2010.

    J'arrive pour l'instant à récupérer de simples entiers mais lorsqu'il s'agit de récupérer les données d'une classe DataTable j'obtiens l'erreur suivante :
    Error: Une erreur s'est produite en tentant de désérialiser le paramètre http://tempuri.org/:oDataTable. Pour plus d'informations, consultez InnerException.
    Le client appelle d'abord la méthode GetTable définie dans mon interface utilisée pour le ServiceContract
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [OperationContract()]
    void GetTable(ref cDataTable oDataTable);
    Le serveur de son côté instancie une DataTable et appelle le constructeur de ma classe de données cDataTable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DataTable dt = new DataTable("dt name");
    oDataTable = new cDataTable(dt);
    Voici la définition de ma classe de données cDataTable :

    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
    [DataContract()]
    [KnownType(typeof(DataTable))]
    public class cDataTable
    {
        private DataTable m_oDataTable;
     
        [DataMember()]
        public DataTable dataTable
        {
            get
            {
                return m_oDataTable;
            }
            set
            {
            }
        }
     
        public cDataTable(DataTable oDataTable)
        {
            m_oDataTable = oDataTable;
        }
    }
    L'erreur se produit avant même la lecture de données côté client.

    Quelle est mon erreur ici ?

    Merci par avance.

  2. #2
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Bonjour,
    que dit l'InnerException ?
    Avec un constructeur sans parametres ?
    Avec un setter sur la propriété dataTable ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    En effet, l'instanciation de DataTable sans paramètres règle le message de désérialisation mais j'obtiens malgré tout :

    Error: La connexion de socket a été abandonnée. Ceci peut être causé par une erreur lors du traitement de votre message, par le dépassement du délai d'attente de réception par l'hôte distant ou par un problème de ressource réseau sous-jacent. Le délai d'attente de socket local était '00:00:59.8740000'.

    De plus, l'erreur de désérialisation revient lorsque j'essaie de redéfinir un nom pour ma table comme : m_oDataTable.TableName = "ma table";


    Le setteur vide ou non ne change rien quand à l'InnerException je ne la trouve pas dans mes logs (la balise InnerException ne contient rien).

  4. #4
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    classe cDataTable
    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
     
    [DataContract()]    
        public class cDataTable
        {
            private DataTable m_oDataTable;
     
            [DataMember()]       
            public DataTable dataTable
            {
                get
                {
                    return m_oDataTable;
                }
                set
                {
                    m_oDataTable = value;
                }
            }
        }
    Contrat de service
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        cDataTable Test();
    }
    implementation du service
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Service1 : IService1
    {
        public cDataTable Test()
        {
            var data = new cDataTable();
            data.dataTable = new DataTable("Test dt");
            return data;
         }
    }
    consommation par le client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    using (var proxy = new ServiceReference1.Service1Client())
    {
          var data = proxy.Test();
    }

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Merci pour l'exemple.

    J'ai repris la structure en mettant l'objet cDataTable en valeur de retour au lieu de le mettre en référence en paramètre. J'ai aussi supprimer le constructeur de cDataTable et j'ai mis l'affectation dans le setteur.

    J'obtiens toujours :
    Une erreur s'est produite en tentant de désérialiser le paramètre http://tempuri.org/:TestResult. Pour plus d'informations, consultez InnerException.
    Je continue de chercher de mon côté. Se pourrait-il que mon fichier de configuration soit erroné ? J'ai pris le modèle par défaut avec une connexion TCP sur le port 5000 en local et puisque le partage d'entiers fonctionne j'ai supposé que non.

  6. #6
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Pour plus d'informations, consultez InnerException

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    J'ai trouvé une précision sur l'erreur même si ça ne m'a pas fait beaucoup avancer au final :

    System.InvalidOperationException: DataTable ne prend pas en charge l'inférence de schéma de Xml.

  8. #8
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    J'ai résolu le problème en utilisant un Objet DataSet en tant que [DataMember] au lieu de DataTable :

    Dans mon DataContract :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        [DataMember()]
        public DataSet dataSet
        {
            get
            {
                return m_oDataSet;
            }
            set
            {
                m_oDataSet = value;
            }
        }
    Dans ma méthode GetTable côté serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    oDataTable = new cDataTable();
    DataSet oDataSet = new DataSet();
    oDataSet.Tables.Add(oDeviceTable);
    oDataTable.dataSet = oDataSet;
    Merci !

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

Discussions similaires

  1. [Checkstyle] Erreur incompréhensible Unable to get class information for DecoratorException
    Par gronono dans le forum Qualimétrie
    Réponses: 3
    Dernier message: 04/06/2007, 16h38
  2. [Smarty] erreur dans require_once appelant la class smarty
    Par fongus dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 03/11/2006, 23h04
  3. Réponses: 16
    Dernier message: 28/09/2006, 19h08
  4. [ERREUR] Ne retrouve pas la classe main
    Par Anathema dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 06/07/2005, 17h16
  5. Réponses: 9
    Dernier message: 27/04/2004, 12h01

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