Como você configurar uma propriedade somente get para um serviço WCF Silverlight habilitado

StackOverflow https://stackoverflow.com/questions/403943

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top