Como você configurar uma propriedade somente get para um serviço WCF Silverlight habilitado
-
03-07-2019 - |
Pergunta
Eu não tenho certeza de onde o erro é resultante (do Silverlight, da WCF, outra coisa ...), mas, eu tenho um serviço WCF que está sendo chamado de Silverlight. O método retorna uma classe, com uma propriedade que não tem um setter. Isso gera um erro. Se eu adicionar um setter para a propriedade, em seguida, ele não dá um erro.
O erro é a habitual mensagem de erro Silverlight impenetrável e inútil, mas ...
[Serializable]
[DataContract]
public SomeClass {
DataMember]
public string PropertyA { get; set; }
public string PropertyB { get { return "Hi There"; } }
}
Mostra um erro ...
Mas alterá-lo para:
[Serializable]
[DataContract]
public SomeClass {
[DataMember]
public string PropertyA { get; set; }
public string PropertyB { get { return "Hi There"; } set {} }
}
Nenhum erro.
Inclui o habitual classe ISomeService.svc & SomeService.svc, referências actualizadas no Silverlight chamando o assíncrono cliente, etc., etc.
O que é a maneira correta de configurar a propriedade (algum atributo diferente de "DataMember" para permitir que um get-somente, ou uma propriedade privada-set) para passá-lo sobre o fio?
Solução
No seu exemplo PropertyB não está marcado com um atributo DataMember o que significa que não será exposto no WSDL e ignorado pelo serializador. Mas se você marcar PropertyB com um DataMember então você deve ter um setter (privado, proptected ou pública), a fim de serializar-lo corretamente caso contrário você pode receber uma exceção. Há duas maneiras que eu posso pensar de ter propriedades somente leitura serializados sobre o fio:
[DataContract]
public class SomeClass
{
public SomeClass()
{
_propertyB = "Hi there";
}
[DataMember(Name="PropertyB")]
private readonly string _propertyB;
public string PropertyB
{
get { return _propertyB; }
}
}
Ou este:
[DataContract]
public class SomeClass
{
public SomeClass()
{
PorpertyB = "Hi there";
}
[DataMember]
public string PropertyB
{
get;
private set;
}
}
Por favor, note que se você usar svcutil.exe , o gerado classe de proxy terá tanto getter público e setter para a propriedade que pode não ser o que você está procurando. Neste caso, você pode usar as assembleias de contrato de serviço e contrato de dados no lado do cliente.
Outras dicas
Graças. O conjunto privado parecem ser suficientes. Eu não gosto de ter o método set lá quando não é necessário, mas eu posso lançar um erro se ele for acessado.
[DataMember]
public PropertyB {
get {
return "Hi there";
}
private set {
throw new Exception("Empty setter for use by WCF Service.");
}
}
Ou o que quer.