WCF和数据契约接口

在使用svcutil创建WCF代理时,是否可以包含数据契约inheritance的接口,例如:

public class SomeType: ISometype { public string Name { get; set; } } public interface ISometype { public string Name { get; set; } } 

当我使用它创建代理时,在客户端创建SomeType类型但是没有创建接口,也没有inheritance。 我尝试将接口标记为DataContract,但该属性不允许。

有可能做我想做的事吗?

WCF使用序列化消息传递,并且所有这些消息都需要能够使用DataContractSerializer或XmlSerializer进行序列化。 并且在客户端和服务器之间传递的消息需要在XML模式中表达。

现在,XML模式对接口一无所知 – 所有这些都与具体的实际类型有关。 对于您的客户端可以是从.NET到PHP,从Ruby到(无论如何)的常规方案,您需要确保以可在XML模式中表示的方式表达您希望在客户端和服务器之间发送的所有内容 – 接口不能。 因此,在通用场景中实际上没有办法支持这一点。

如果您正在控制线路的两端,例如您同时在.NET中编写客户端和服务器,那么您可以执行以下操作:

  • 将您的DataContracts(以及您的ServiceContracts和OperationContracts和FaultContracts)全部放入单独的MyServiceContracts程序集中

  • 从服务端代码和客户端引用该程序集。 在这种情况下,当您要创建客户端代理时,您提到的那些类型已经存在,WCF将很乐意重用该程序集中的那些类型。 既然这是你正在引用的.NET程序集,那么你可以拥有.NET支持的任何内容 – 包括接口。

您可以从实现ISometype的类inheritance,并使用KnownType属性将其添加到序列化:

我可以强制svcutil.exe为WCF服务生成数据协定吗?