¿Cómo configura una propiedad de solo obtención para un servicio WCF habilitado para Silverlight?

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

Pregunta

No estoy seguro de dónde se produce el error (de silverlight, de wcf, algo más ...) pero tengo un servicio WCF que se llama de Silverlight. El método devuelve una clase, con una propiedad que no tiene un definidor. Esto arroja un error. Si agrego un setter a la propiedad, entonces no da un error.

El error es el impenetrable e ineficaz mensaje de error de Silverlight, pero ...

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

lanza un error ...

Pero cámbiala a:

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

Sin error.

Incluye el habitual ISomeService.svc & amp; Clase SomeService.svc, referencias actualizadas en Silverlight que llaman al cliente async, etc., etc.

¿Cuál es la forma correcta de configurar la propiedad (algún atributo que no sea " DataMember " para permitir una propiedad get-only o una propiedad privada) para pasarla por el cable?

¿Fue útil?

Solución

En su ejemplo, PropertyB no está marcado con un atributo DataMember, lo que significa que no se expondrá en el WSDL y el serializador lo ignorará. Pero si marca PropertyB con un DataMember, debe tener un configurador (privado, protegido o público) para serializarlo correctamente; de ??lo contrario, puede obtener una excepción. Hay dos formas en las que puedo pensar en tener propiedades de solo lectura serializadas por cable:

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

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

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

O esto:

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

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

Tenga en cuenta que si utiliza svcutil.exe , la clase de proxy generada tendrá tanto getter como setter para la propiedad, que puede no ser lo que está buscando. En este caso, puede utilizar el contrato de servicios y los conjuntos de contratos de datos en el lado del cliente.

Otros consejos

Gracias. El conjunto privado parece ser suficiente. No me gusta tener el método set allí cuando no es necesario, pero puedo arrojar un error si se accede a él.

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

O lo que sea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top