Domanda

Non sono sicuro da dove provenga l'errore (da silverlight, da wcf, qualcos'altro ...) ma, ho un servizio WCF chiamato da Silverlight. Il metodo restituisce una classe, con una proprietà che non ha un setter. Questo genera un errore. Se aggiungo un setter alla proprietà, non viene visualizzato un errore.

L'errore è il solito messaggio di errore Silverlight impenetrabile e inutile, ma ...

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

Genera un errore ...

Ma modificalo in:

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

Nessun errore.

Include il solito ISomeService.svc & amp; Classe SomeService.svc, riferimenti aggiornati in Silverlight chiamando il client asincrono, ecc. Ecc.

Qual è il modo corretto di configurare la proprietà (qualche attributo diverso da " DataMember " per consentire a una proprietà get-only o private-set) di passarla sul filo?

È stato utile?

Soluzione

Nel tuo esempio PropertyB non è contrassegnato con un attributo DataMember, il che significa che non verrà esposto nel WSDL e ignorato dal serializzatore. Ma se si contrassegna PropertyB con un DataMember, è necessario disporre di un setter (privato, protetto o pubblico) per serializzarlo correttamente, altrimenti si potrebbe ottenere un'eccezione. Ci sono due modi in cui posso pensare di avere le proprietà di sola lettura serializzate via cavo:

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

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

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

O questo:

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

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

Si noti che se si utilizza svcutil.exe , il la classe proxy generata avrà sia getter pubblico che setter per la proprietà che potrebbe non essere quello che stai cercando. In questo caso è possibile utilizzare il contratto di servizio e le assemblee del contratto dati sul lato client.

Altri suggerimenti

Grazie. Il set privato sembra essere sufficiente. Non mi piace avere il metodo set lì quando non è necessario, ma posso lanciare un errore se vi si accede.

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

O qualunque altra cosa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top