Question

Je ne suis pas certain de la cause de l'erreur (de Silverlight, de wcf, de quelque chose d'autre ...) mais j'ai un service WCF appelé depuis Silverlight. La méthode retourne une classe, avec une propriété qui n'a pas de setter. Cela jette une erreur. Si j'ajoute un séparateur à la propriété, cela ne générera pas d'erreur.

L'erreur correspond au message d'erreur Silverlight impénétrable et peu habituel, mais ...

[Serializable]  
[DataContract]  
public SomeClass {  
    DataMember]  
    public string PropertyA { get; set; }  
    public string PropertyB { get { return "Hi There"; } }  
}  

Lance une erreur ...

Mais changez le en:

[Serializable]  
[DataContract]  
public SomeClass {  
     [DataMember]  
     public string PropertyA { get; set; }  
     public string PropertyB { get { return "Hi There"; } set {} }  
}  

Aucune erreur.

Inclut les fichiers ISomeService.svc & amp; SomeService.svc, mises à jour des références dans Silverlight appelant le client en mode asynchrone, etc., etc.

Quelle est la bonne façon de configurer la propriété (un attribut autre que "DataMember" pour permettre à une propriété get-only ou private-set) de la transmettre par le fil?

Était-ce utile?

La solution

Dans votre exemple, PropertyB n'est pas marqué avec un attribut DataMember, ce qui signifie qu'il ne sera pas exposé dans le WSDL et ignoré par le sérialiseur. Mais si vous marquez PropertyB avec un DataMember, vous devez disposer d'un séparateur (privé, protégé ou public) pour le sérialiser correctement, sinon vous risquez d'obtenir une exception. Il y a deux façons de penser à la sérialisation des propriétés en lecture seule sur le réseau:

[DataContract]
public class SomeClass
{ 
    public SomeClass()
    {
        _propertyB = "Hi there";
    }

    [DataMember(Name="PropertyB")]
    private readonly string _propertyB;

    public string PropertyB
    {
        get { return _propertyB; }
    }
}

Ou ceci:

[DataContract]
public class SomeClass
{ 
    public SomeClass()
    {
        PorpertyB = "Hi there";
    }

    [DataMember]
    public string PropertyB
    {
        get;
        private set;
    }
}

Notez que si vous utilisez svcutil.exe , le La classe proxy générée aura à la fois des getter et des setter publics pour la propriété, ce qui pourrait ne pas être ce que vous cherchez. Dans ce cas, vous pouvez utiliser les ensembles de contrats de service et de contrats de données côté client.

Autres conseils

Merci. L'ensemble privé semble suffire. Je n'aime pas avoir la méthode set ici quand ce n'est pas nécessaire, mais je peux générer une erreur en cas d'accès.

[DataMember]  
public PropertyB {  
    get {  
         return "Hi there";  
    }  
    private set {  
         throw new Exception("Empty setter for use by WCF Service.");
    }  
}      

Ou peu importe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top