Silverlight対応のWCFサービスの取得専用プロパティをどのように構成しますか
-
03-07-2019 - |
質問
エラーが発生した場所はわかりません(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で更新された参照など。
プロパティを取得するための正しい設定方法は何ですか(" DataMember"以外の属性は取得のみ、またはprivate-setプロパティを許可します)?
解決
例では、PropertyBはDataMember属性でマークされていません。つまり、WSDLで公開されず、シリアライザーによって無視されます。ただし、PropertyBをDataMemberでマークする場合、正しくシリアル化するにはセッター(プライベート、保護、またはパブリック)が必要です。そうしないと、例外が発生する可能性があります。読み取り専用のプロパティをネットワーク経由でシリアル化する方法は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 を使用する場合、生成されたプロキシクラスには、プロパティのパブリックゲッターとセッターの両方がありますが、これは探しているものではない可能性があります。この場合、クライアント側でサービスコントラクトとデータコントラクトアセンブリを使用できます。
他のヒント
ありがとう。プライベートセットで十分なようです。必要のないときにsetメソッドを使用するのは好きではありませんが、アクセスするとエラーがスローされる可能性があります。
[DataMember]
public PropertyB {
get {
return "Hi there";
}
private set {
throw new Exception("Empty setter for use by WCF Service.");
}
}
または何でも。