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 :

Méthode avec un paramètre de type "object" : comment lui passer une List ?


Sujet :

Windows Communication Foundation .NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Picsonald
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 25
    Par défaut Méthode avec un paramètre de type "object" : comment lui passer une List ?
    Bonjour à tous,

    Je suis actuellement en train de coder un service WCF dont une des méthodes doit pouvoir récupérer en paramètre un String, un Int32 ou une List<String>.

    Concrètement, le code serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [ServiceContract]
    class MonService
    {
        [OperationContract]
        void PasserObjet(Object monObjet)
        {
            // Je peux recevoir un String, un Int32 ou une List<String>.
            MessageBox.Show("Objet de type " + monObjet.GetType().FullName);
        }
    }

    Voici ce qu'il se passe lorsque le programme client sollicite la méthode "PasserObjet" de mon service WCF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void btn1_Click(object sender, EventArgs e)
    {
        proxy.PasserObjet("Chaine de caractère");
    }
    Dans le cas présent, mon serveur me dit "Objet de type System.String". Je peux alors faire un cast et utiliser mon paramètre. Tout va bien.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void btn2_Click(object sender, EventArgs e)
    {
        List<String> _lstStr = new List<String>();
        _lstStr.Add("Liste de");
        _lstStr.Add("chaine de");
        _lstStr.Add("caractère.");
        proxy.PasserObjet(_lstStr);
    }
    Dans ce cas par contre, le programme client plante et me renvoie une exception qui ressemble à cela :
    Une erreur s'est produite en tentant de sérialiser le paramètre. Le type 'System.Collections.Generic.List`1[System.String]' avec le nom de contrat de données 'ArrayOfstring' n'est pas attendu. Utilisez un DataContractResolver ou ajoutez tous les types non connus statiquement à la liste des types connus, par exemple en utilisant l'attribut KnownTypeAttribute.
    Le serveur ne se sent pas sollicité et reste stable.


    Avez-vous une idée pour résoudre ce problème ? J'ai fait pas mal de recherches sur Internet, et je ne vois pas de solution...

    Merci d'avance !

  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

    Il faut utiliser l'attribut KnownType pour chaque type à passer, sinon WCF ne peux pas déterminer à quels types il est susceptible d'avoir affaire.

  3. #3
    Membre averti Avatar de Picsonald
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 25
    Par défaut
    Merci pour ta réponse Bluedeep.

    Je viens d'essayer. "KnowType", en soit, n'est pas reconnu. Donc j'ai utilisé "ServiceKnownType" de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [OperationContract, ServiceKnownType(typeof(List<String>))]
    void PasserObjet(Object objet)
    {
        MessageBox.Show("Objet de type " + objet.GetType().FullName);
    }
    Ça n'a pas fonctionné. Du coup j'ai essayer de déposer l'attribut au niveau de la classe carrément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [ServiceContract]
    [ServiceKnownType(typeof(List<String>))]
    class SupervisionService
    {
        // ...
    }
    L'erreur reste la même. Y a-t-il quelque chose que je fais mal ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Peut-on savoir ce qui t'empêche d'avoir autant d'opérations qu'il y a de types à utiliser ? Parce que là dans ce que tu fais ça ne sent pas du tout la bonne pratique.

  5. #5
    Membre averti Avatar de Picsonald
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 25
    Par défaut
    @ h2s84 : Oh... oui :-). Mais c'est loin d'être évident.

    Mon service WCF est utilisé par des programmes clients qui s’exécutent sur quelques unes de mes machines distantes. Le serveur a pour but de me montrer en un coup d’œil l'état de mes clients (supervision).

    Les clients peuvent m'envoyer un Int32 qui contiendra le taux de remplissage du disque dur, ou de la mémoire vive.
    Il peuvent m'envoyer un String qui contiendra la version d'un driver, la version de Windows Update.
    Il peuvent m'envoyer une List<String> qui contiendra la liste des process en cours d'exécution ou la liste des utilisateurs connectés.


    Pourquoi ne pas faire des méthodes dédiées ? Pour des motifs de rétrocompatibilité et d'évolutivité.

    Admettons qu'un jour, je souhaite également surveiller la version de mes anitivirus, l'état du trafic réseau, la liste des services anormalement arrêtés... Je vais devoir changer le code source de mon client, mais celui du serveur : non. Le serveur connait les critères de surveillance grâce à des infos situées en base de données, et il est capable de les retranscrire à l'aide d'un code dynamique.

    A terme, toute version de mon serveur pourra fonctionner avec toute version de mon client, sans risque, du coté de mon client, un plantage pour "Méthode distante inexistante".


    Tu penses que je fais fausse route avec mon paramètre "Object" ?




    Bluedeep, Ok je vais essayer de regarder ça. Les surcharges, perso, moi, ça ne veut pas marcher (mais j'ai pas beaucoup creusé dans ce sens).

  6. #6
    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
    Citation Envoyé par Picsonald Voir le message
    Admettons qu'un jour, je souhaite également surveiller la version de mes anitivirus, l'état du trafic réseau, la liste des services anormalement arrêtés... Je vais devoir changer le code source de mon client, mais celui du serveur : non. .
    Mais si, tu devras changer le code du serveur, puisque une ligne KnownType devra de toute manière être ajoutée en plus.

    C'est la raison pour laquelle on utilise normalement le KnownType que pour les retours et les propriétés : pour les arguments, la surcharge de méthode remplit bien mieux la tâche.

    A vrai dire, peut on utiliser le KnownType pour les arguments ? à la réflexion, je n'en sais rien puisque cela ne correspond à aucun besoin de design normal.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ok je vois. Mais là j'aimerai savoir comment à partir du passage d'un Int32 ton code côté serveur pourra différencier qu'il s'agit de la quantité de la mémoire RAM ou que c'est celle de la taille du disque dur.

    Sinon au lieu de lui passer une collection de string List<string> essaies de lui passer un tableau de string string[] et voir ce que ça donne.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 201
    Par défaut
    Euh Je trouve illogique de passer un Objet

    Crées 3 méthodes différentes

    perso je passe des list<string>, des list<int>, des list<MesClasses> sans problème

    les string[] seront convertis en list<string>

  9. #9
    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

    Bizarre; j'ai toujours utilisé cela sur la classe qui contient le DataContract (mais jamais sur le ServiceContract au demeurant).

    Si tu utilises le ServiceKnownType, donc sur le ServiceContract, tu dois aussi préciser le nom de la méthode concernée. (en général, on définit cela au niveau de l'interface, pas de l'implémentation du service).


    Mais il est vrai que cela a toujours été sur des retours et pas sur des arguments (dans ce cas, il est plus simple de mettre une méthode surchargée pour chaque type).

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 18/05/2010, 17h31
  2. Réponses: 8
    Dernier message: 19/02/2010, 12h47
  3. appel d'une méthode avec plusieurs paramètres
    Par soujava dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 11/05/2008, 23h30

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