我不确定导致错误的位置(来自silverlight,来自wcf,还有其他东西......)但是,我从Silverlight调用了WCF服务。该方法返回一个类,其属性没有setter。这会引发错误。如果我向属性添加一个setter,那么它不会给出错误。
错误是通常难以理解且无用的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”以外的某些属性允许get-only或private-set属性)通过网络传递它?
答案 0 :(得分:3)
感谢。私人套装似乎已足够。我不喜欢在不需要时使用set方法但是如果访问它我会抛出错误。
[DataMember]
public PropertyB {
get {
return "Hi there";
}
private set {
throw new Exception("Empty setter for use by WCF Service.");
}
}
或者其他什么。
答案 1 :(得分:1)
在您的示例中,PropertyB未标记DataMember属性,这意味着它不会在WSDL中公开并被序列化程序忽略。但是如果你用DataMember标记PropertyB,那么你必须有一个setter(private,proptected或public)才能正确序列化,否则你可能会遇到异常。我可以通过两种方式考虑通过线路序列化只读属性:
[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,生成的代理类将同时具有该属性的公共getter和setter,这可能不是您要查找的内容。在这种情况下,您可以在客户端使用服务合同和数据协定程序集。