Frage

Ich bin nicht sicher, wo der Fehler (von Silverlight, von wcf, etwas anderes ...) wird, was aber, ich habe einen WCF-Dienst von Silverlight aufgerufen wird. Die Methode gibt eine Klasse mit einer Eigenschaft, die nicht einen Setter hat. Dies wirft einen Fehler. Wenn ich einen Setter auf die Eigenschaft hinzufügen, dann ist es nicht zu einem Fehler führen.

Der Fehler ist die übliche undurchdringliche und wenig hilfreich Silverlight Fehlermeldung, aber ...

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

Wirft einen Fehler ...

Aber ändern Sie es an:

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

Kein Fehler.

Enthält die übliche ISomeService.svc & SomeService.svc Klasse, aktualisierten Referenzen in Silverlight die Client-Asynchron-Aufruf, usw. usw.

Was ist der richtige Weg, um die Eigenschaft (einige Attribute anders als „Datamember“ zu ermöglichen, einem Get-only oder eine private Satz Eigenschaft) passiert sie über den Draht?

konfigurieren
War es hilfreich?

Lösung

In Ihrem Beispiel PropertyB nicht mit einem Datamember-Attribute markiert was bedeutet, dass es nicht durch den Serializer in der WSDL und ignoriert ausgesetzt werden. Aber wenn Sie PropertyB mit einem Datamember markieren, dann müssen Sie einen Setter haben (privat, proptected oder öffentlich), um es zu serialisieren richtig sonst können Sie eine Exception. Es gibt zwei Möglichkeiten, wie ich zu haben Nur-Lese-Eigenschaften denken kann über den Draht serialisiert:

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

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

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

Oder diese:

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

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

Bitte beachten Sie, dass, wenn Sie verwenden svcutil.exe , die generierte Proxy-Klasse wird sowohl öffentliche Getter und Setter für die Eigenschaft, die möglicherweise nicht, was Sie suchen. In diesem Fall können Sie den Service-Vertrag und Datenvertrag Baugruppen auf der Client-Seite verwenden.

Andere Tipps

Danke. Der private Satz scheint ausreichend zu sein. Ich weiß nicht, wie die Set-Methode gibt, die, wenn sie nicht benötigt wird, aber ich kann einen Fehler aus, wenn auf sie zugegriffen wird.

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

oder was auch immer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top