2

エラーがどこで発生しているのか(Silverlight、wcf、その他...)はわかりませんが、Silverlightから呼び出されているWCFサービスがあります。このメソッドは、セッターを持たないプロパティを持つクラスを返します。これはエラーをスローします。プロパティにセッターを追加しても、エラーは発生しません。

このエラーは、通常の侵入不可能で役に立たないSilverlightエラーメッセージですが...

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

エラーをスローします...

ただし、次のように変更します。

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

エラーはありません。

通常のISomeService.svcおよびSomeService.svcクラス、クライアント非同期を呼び出すSilverlightで更新された参照などが含まれます。

プロパティ(get-onlyまたはprivate-setプロパティを許可するための「DataMember」以外の属性)を構成して、ネットワークを介して渡す正しい方法は何ですか?

4

2 に答える 2

3

ありがとう。専用セットで十分なようです。必要のないときに set メソッドを使用するのは好きではありませんが、アクセスするとエラーがスローされる可能性があります。

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

または何でも。

于 2009-01-02T19:19:03.987 に答える
1

あなたの例では、PropertyB は DataMember 属性でマークされていません。つまり、WSDL で公開されず、シリアライザーによって無視されます。ただし、PropertyB を DataMember でマークする場合は、正しくシリアル化するためにセッター (private、proptected、または public) が必要です。そうしないと、例外が発生する可能性があります。読み取り専用プロパティをネットワーク上でシリアル化する方法は 2 つあります。

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

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

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

またはこれ:

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

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

svcutil.exeを使用する場合、生成されたプロキシ クラスには、探しているものではない可能性があるプロパティの public getter と setter の両方が含まれることに注意してください。この場合、クライアント側でサービス コントラクトとデータ コントラクト アセンブリを使用できます。

于 2009-01-01T08:23:53.120 に答える