使用svcutil创建WCF代理时,是否可以包含数据契约继承的接口,例如:
public class SomeType: ISometype
{
public string Name { get; set; }
}
public interface ISometype
{
public string Name { get; set; }
}
当我使用它创建代理时,SomeType类型是在客户端创建的,但是没有创建接口,也没有继承。我尝试将接口标记为DataContract,但该属性不允许。
我可以做我想做的事吗?
答案 0 :(得分:21)
WCF使用序列化消息传递,所有这些消息都需要能够使用DataContractSerializer或XmlSerializer进行序列化。并且在客户端和服务器之间传递的消息需要在XML模式中表达。
现在,XML模式对接口一无所知 - 所有这些都与具体的实际类型有关。对于客户端可以是从.NET到PHP,从Ruby到(无论如何)的常规方案,您需要确保以可在XML模式中表示的方式表达您希望在客户端和服务器之间发送的所有内容 - 接口不能。所以在通用场景中真的没有办法支持这个。
如果你控制电线的两端,例如你在.NET中编写客户端和服务器,然后你可以这样做:
将您的DataContracts(以及您的ServiceContracts和OperationContracts和FaultContracts)全部放入单独的MyServiceContracts
程序集
从服务端代码和客户端引用该程序集。在这种情况下,当您要创建客户端代理时,您提到的那些类型已经存在,WCF将很乐意重用该程序集中的那些类型。由于这是一个你正在引用的.NET程序集,你可以拥有.NET支持的任何东西 - 包括接口。
答案 1 :(得分:2)
您可以从实现ISometype
的类继承,并使用KnownType属性将其添加到序列化中:
Can I force svcutil.exe to generate data contracts for a WCF service?