添加WCF服务引用也会添加DataContract类型

时间:2010-03-14 08:40:39

标签: .net wcf

我已经使用Visual Studio的添加服务引用功能来添加服务(实际上它是一个工作流服务,在WF4 RC1中创建,但我认为这没有任何区别),并且它还添加了DataContracts,服务用途。起初这看起来很好,因为我在DataContracts中所拥有的只是属性,没有实现。但是现在我在一个数据协定的构造函数中添加了代码,初始化创建了一个暴露其他DC列表的属性的实例,当我通过VS(2010 RC1)更新服务引用时,实现没有更新。

我该怎么办?我应该使用我的DC而不是VS创建的DC,还是应该使用VS创建的?我注意到VS生成的DC中的属性包含一些额外的逻辑,用于检查setter中的相等性,并且它们也实现了一些接口(如IExtensibleDataObject和INotifyPropertyChanged),这可能会在将来得到方便(我不是在WCF知识渊博。

感谢您的时间, 阿维

2 个答案:

答案 0 :(得分:6)

是的,这就是它的工作方式 - 当你有一个单独的自主服务时,如果你考虑它,那它就是唯一可行的方法。

如果您控制电线的两端,例如你写了服务和客户,你当然可以做更多的事情:

  • 您可以将所有服务和数据合同放入单独的程序集MyContracts中,然后在服务和客户端添加对该程序集的引用

  • 当您这样做时,Visual Studio不会重新创建它在引用的程序集中找到的那些类型,但它只会使用那些

但是你需要非常小心:数据合同应该只包含数据 - 绝不会有任何行为!所以要特别注意不要将任何基于行为的东西放入DataContracts。 WCF中客户端和服务之间传递的消息是一个纯文本的序列化消息 - 你不能在两者之间传递任何代码,真的 - 记住这一点!

答案 1 :(得分:1)

marc_s ,如果我的客户端在Silverlight中,如何创建这个单独的程序集“MyContracts”?我当然不能将此程序集创建为.NET程序集,因为在这种情况下,无法从我的SL项目中引用它。是的,我可以将此程序集创建为“ SL 类库”,甚至可以从我的WCF项目中引用它,但是我无法在Studio中执行“更新服务引用”!我收到错误“无法加载文件或程序集'System.Runtime.Serialization,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e'或其中一个依赖项。系统找不到指定的文件”。请注意,v.2.0.5.0是此DLL的SILVERLIGHT版本,而不是.NET版本!似乎它需要这个DLL来理解“MyContracts”程序集中存在的DataContract / DataMember属性。如果我把这个DLL放在服务器上(托管我的WCF服务) - 问题就会消失,但是那些不使用“MyContracts”程序集并且在其自身内部包含DataContracts的服务会出现另一个问题:“Type'......'无法序列化。请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员。有关其他受支持的类型,请参阅Microsoft .NET Framework文档“。似乎无法理解使用哪个System.Runtime.Serialization.dll - SL或.NET。有什么想法吗?!