在客户端未初始化DataContract类

问题描述:

我有下面的类,我想从我的WCFC#)服务发送给我的客户(WPF):在客户端未初始化DataContract类

[DataContract] 
    public class OutputAvailableEventArgs 
    { 
     [DataMember] 
     public int ID { get; set; } 
     [DataMember] 
     public string Message { get; private set; } 
     [DataMember] 
     public bool IsError { get; private set; } 

     public OutputAvailableEventArgs(int id) : this(id, false, "") { } 

     public OutputAvailableEventArgs(int id, string output) : this(id, false, output) { } 

     public OutputAvailableEventArgs(int id, bool isError, string output) 
     { 
      ID = id; 
      IsError = isError; 
      Message = output; 
     } 
    } 

它使用的服务如下:

var channel = OperationContext.Current.GetCallbackChannel<IClientCallback>(); 

channel.OutputAvailable(new OutputAvailableEventArgs(1, false, "some message")); 

在客户端,成员获取其默认值。
我试着用IsRequired属性标记它们,但现在客户端上的OutputAvailable未被调用。在服务端的代码似乎运行顺利(我没有注意到任何与调试器)。

如何在保持会员价值的同时将DataContract班级转入WCF
(我看到,建议使用OnSerializedOnDeserialized解决方案,但我不需要只是一个默认的构造函数)。

+0

如果可能,请使用fiddler查看Service返回的内容以及客户端收到的消息中的内容。 – jags 2013-03-05 09:29:01

我看到了这个问题很多不同的解决方案。对于其他人的缘故,我会写下他们中的一些+对我来说什么:

  1. 看来,在某些情况下指定项目的顺序解决了问题。详情请参阅this SO question
  2. 如果它是一些默认的初始化,您可以使用OnSerializedOnDeserialized方法调用您的初始化方法。
  3. 我也试过在我的DataMember上使用IsRequired属性,但仍没有得到我的对象。

对我来说有效的是adding NameSpace property,DataContract属性。显然,为了让合约被视为相等,您必须将DataContract上的Namespace属性设置为双方相同的值。