我不确定导致错误的位置(来自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属性)通过网络传递它是什么?

有帮助吗?

解决方案

在您的示例中,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,这可能不是您正在寻找的。在这种情况下,您可以在客户端使用服务合同和数据协定程序集。

其他提示

感谢。私人套装似乎已足够。我不喜欢在不需要时使用set方法但是如果访问它我会抛出错误。

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

或者其他什么。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top