10
votes

Valeurs par défaut du service WCF

J'ai suivi de la classe de contrats de données pour mon service WCF:

MyClassDTO mcdto = new MyClassDTO();
serviceClient.DoSomething(mcdto);


[OperationContract]
void DoSomething(MyClass mc){
   mc.Name //<--   == null    but I want it to be "Default Name"
}


0 commentaires

4 Réponses :


2
votes

hmmm .. i pensé em> qu'il y avait des choses avec [DefaultValue (...)] code> qui fonctionnerait, mais apparemment pas; Je suis un peu confus pourquoi vous obtenez null code>, bien que vous ne l'avez pas parlé d'une valeur par défaut, je m'attendrais à "nom par défaut" code> pour entrer dans la sortie. Si vous em> avez em> certains code par défaut (ou un osérialize * code> / * spécifié code>) alors vous pourriez essayer:

using (var client = new Service1Client()) {
    var result = client.GetDataUsingDataContract();
    Console.Write(result.Name); // "Default Name"
}


1 commentaires

Oui avec le serveur de direction -> Client Ceci fonctionne bien. Mais dans la direction client -> serveur, cela ne fonctionne pas. Notez que sur le site client, la classe DataContract MyClassDTo est générée que celle utilisée uniquement du côté client. Le client ne connaît pas MyClass et le côté serveur n'est pas au courant de la classe myClassdto



2
votes

Je ne crois pas que le schéma XML permet la description d'une valeur par défaut d'un élément. Cela signifie que, en ce qui concerne un client de votre service, il est aucune valeur par défaut.

En outre lequel, vous n'avez rien fait pour indiquer à WCF que vous voulez avoir une valeur par défaut, alors même s'il y avait un moyen de communiquer votre intention d'un client, le fait est que vous ne communiquez pas votre intention.


1 commentaires

C'est parce que je cherche un moyen de le communiquer :-) Mais cela semble (comme vous l'avez dit) qu'il n'y a aucun moyen de le faire.



1
votes

Pendant la désérialisation, la logique "définie" de votre propriété sera exécutée, de sorte que vous pourriez vérifier que NULL existe et défini sur n'importe quelle valeur par défaut souhaitée est à ce stade.


1 commentaires

Cela semble être le seul moyen d'atteindre mon objectif. Mais pendant la désérialisation, aucun constructeur n'est appelé et que l'objet n'est pas initialisé, vous devez donc utiliser les variables constantes.



4
votes

Le seul possible (mais laide et laide et non vraiment satisfaisante) Solution que j'ai trouvée aussi loin utilise l'attribut Ondesérializing code> pour définir les valeurs par défaut au début de la désérialisation d'un champ d'utilisation d'un champ. Pour déterminer si la valeur communiquée doit être réellement définie.

   [DataContract(Name = "MyClassDTO")]
    public class MyClass
    {
        private string name;

        public MyClass()
        {
            Init();
        }

        [DataMember]
        public string Name
        {
            get{ return name; }
            set
            {
                if (!String.IsNullOrEmpty(value))
                {
                    name = value;
                }
            }
        }

        private void Init()
        {
            name = "Default Name";
        }

        [System.Runtime.Serialization.OnDeserializing]
        private void OnDeserializing(StreamingContext ctx)
        {
            Init();
        }
  }


0 commentaires