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 中调用客户端异步等更新的引用等。

配置属性(“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 中公开并被序列化程序忽略。但是,如果您使用 DataMember 标记 PropertyB,那么您必须有一个 setter(私有、受保护或公共)才能正确序列化它,否则您可能会遇到异常。有两种方法可以考虑通过网络对只读属性进行序列化:

[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 属性,这可能不是您要查找的。在这种情况下,您可以在客户端使用服务合同和数据合同程序集。

于 2009-01-01T08:23:53.120 回答