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

Windows Communication Foundation .NET Discussion :

WCF - Classe complexe en paramètre de retour d'une OperationContract


Sujet :

Windows Communication Foundation .NET

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : avril 2014
    Messages : 13
    Points : 9
    Points
    9
    Par défaut WCF - Classe complexe en paramètre de retour d'une OperationContract
    Bonjour à tous.

    Je souhaiterai obtenir votre aide sur un problème sur lequel je bloque depuis quelques jours.
    Je souhaite, via mon service WCF, faire transiter un objet dit "complexe" (contenant autre chose que des bool, int, double string etc...) entre le service et son client.
    Mon service est hébergé actuellement dans une application console et le client dans une application WPF toutes deux sur la même machine.

    Voici les classes que j'utilise et qui contiennent mes données. L'architecture de mon application m'impose de lier ces classes à des interfaces.
    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 ClassSimple: IClassSimple
        {
            [DataMember]
            public string Name{ get; set; }
     
            [DataMember]
            public double Value { get; set; 
        }
     
        [DataContract]
        public class ClassComplexe: IClassComplexe, IList<IClassSimple>
        {
            [DataMember]
            public List<IClassSimple> ListClassSimple{ get; set; }
     
            ...
        }
    Voici le contrat de mon service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        [ServiceContract]
        public interface IMonService
        {
            [OperationContract]
            ClasseSimple GetClasseSimple();
     
            [OperationContract]
            ClasseComplexe GetClasseComplexe();
     
        }
    Et son implémentation.

    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
     
        [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
        public class ServiceImplementation : IMonService
        {
            public ClasseSimple GetClasseSimple()
            {
                  var simple = new ClasseSimple();
                  simple.Name = "Test";
                  simple.Value = 2;
     
                  return simple;
            }
     
            public ClasseComplexe GetClasseComplexe()
            {
                  var simple1 = new ClasseSimple();
                  simple.Name = "Test1";
                  simple.Value = 1;
     
                  var simple2 = new ClasseSimple();
                  simple.Name = "Test2";
                  simple.Value = 2;
     
                  var complexe = new ClasseComplexe();
                  complexe.Add(simple1);
                  complexe.Add(simple2);
     
                  return complexe;
            }
     
        }
    La communication semble bien se passer entre le client et le serveur puisque lorsque j'appelle la fonction GetClasseSimple() depuis mon client, je récupère bien l'objet attendu. Par contre, lorsque je fais appelle à la fonction GetClasseComplexe(), le code côté serveur est bien executé côté serveur mais au moment de "return" l'objet instancié, une Exception de type
    "System.ServiceModel.CommunicationException"
    est levée avec les informations suivantes :

    Message :
    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.9020000'.
    InnerException :
    Une connexion existante a dû être fermée par l’hôte distant
    J'ai essayé d'ajouter les attributs suivants à mon service mais rien n'y fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        [ServiceKnownType(typeof(ClasseSimple))]
        [ServiceKnownType(typeof(ClasseComplexe))]
    Quelqu'un aurait il une idée sur l'origine de mon erreur?

    Merci d'avance!

  2. #2
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2013
    Messages : 1 563
    Points : 3 401
    Points
    3 401
    Par défaut
    Bonjour,

    Les [KnowType()] doivent s'utiliser sur tes classes dont les propriétés sont des types non générique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [DataContract]
    [KnownType(typeof(MonType))]
    public class MaClasse
    {
          public MonType toto{get;set;}
    }

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : avril 2014
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Bonjour ZenZiTone et merci!

    Il semblerait que j'avais en effet mal placé mes [KnowType()] ! Je n'avais pas bien réfléchi lorsque j'ai voulu les utiliser mais en effet ton commentaire m'a fait comprendre leur utilité...

    En décorant ma classe complexe comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        [DataContract]
        [KnownType(typeof(ClassSimple))]
        public class ClassComplexe: IClassComplexe, IList<IClassSimple>
        {
            [DataMember]
            public List<IClassSimple> ListClassSimple{ get; set; }
     
            ...
        }
    Tout semble être rentré dans l'ordre pour le moment!
    Je vais tester sur la version "officielle" et plus complexe du code pour vérifier que tout fonctionne.

    Je garde précieusement de côté ton lien pour le paramétrage un peu plus poussé du service qui je suis sûr va lui aussi m'être rapidement utile!

    Encore merci

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

Discussions similaires

  1. retour d'une classe en WCF
    Par olibara dans le forum Services Web
    Réponses: 2
    Dernier message: 08/03/2010, 17h45
  2. Réponses: 6
    Dernier message: 18/04/2009, 11h37
  3. [PDO] Paramètre de retour d'une procèdure stockée
    Par Sinclair dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 30/10/2007, 22h14
  4. [Débutant]Passer une classe abstraite en paramètre
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 06/01/2006, 17h56
  5. Réponses: 3
    Dernier message: 30/05/2005, 23h28

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