2008-12-31 10 views
2

Je ne suis pas certain d'où provient l'erreur (de silverlight, de wcf, autre chose ...) mais, j'ai un service WCF appelé depuis Silverlight. La méthode renvoie une classe, avec une propriété qui n'a pas de setter. Cela lance une erreur. Si j'ajoute un setter à la propriété, cela ne donne pas d'erreur.Comment configurer une propriété get-only pour un service WCF activé par Silverlight

L'erreur est le message d'erreur Silverlight impénétrable et inutile d'habitude, mais ...

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

génère une erreur ...

Mais le changement à:

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

Non Erreur.

Comprend la classe habituelle ISomeService.svc & SomeService.svc, les références mises à jour dans Silverlight appelant le async client, etc., etc.

Quelle est la bonne façon de configurer la propriété (certains attributs autres que « DataMember "pour permettre à une propriété de type" get-only "ou" private-set "de passer le fil?

Répondre

1

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 alors vous devez avoir un setter (privé, proptected ou public) afin de le sérialiser correctement sinon vous pourriez avoir une exception. Il y a deux façons que je peux penser ayant des propriétés en lecture seule sérialisé sur le fil:

[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; 
    } 
} 

S'il vous plaît noter que si vous utilisez svcutil.exe, la classe proxy générée aura à la fois getter public et setter pour la propriété qui pourrait ne pas être ce que vous recherchez. Dans ce cas, vous pouvez utiliser le contrat de service et les ensembles de contrats de données côté client.

3

Merci. L'ensemble privé semble être suffisant. Je n'aime pas avoir la méthode set là quand ce n'est pas nécessaire mais je peux lancer une erreur si on y accède.

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

Ou quoi que ce soit.