Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF和数据合同接口_C#_.net_Wcf - Fatal编程技术网

C# WCF和数据合同接口

C# WCF和数据合同接口,c#,.net,wcf,C#,.net,Wcf,在使用svcutil创建WCF代理时,是否可以包括数据契约继承的接口,例如: public class SomeType: ISometype { public string Name { get; set; } } public interface ISometype { public string Name { get; set; } } 当我使用这个创建代理时,SomeType类型在客户端创建,但是接口没有创建,也没有继承。我尝试将接口标记为DataContract,但不允

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

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

public interface ISometype
{
   public string Name { get; set; }
}
当我使用这个创建代理时,SomeType类型在客户端创建,但是接口没有创建,也没有继承。我尝试将接口标记为DataContract,但不允许该属性


是否可以执行我试图执行的操作?

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


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

现在,XML模式对接口一无所知——它只知道具体的、实际的类型。对于一个常规场景,您的客户机可以是从.NET到PHP到Ruby的任何东西,您需要确保以一种可以用XML模式表示的方式在客户机和服务器之间表达您想要发送的所有内容—接口不能。因此,在通用场景中,确实没有办法支持这一点

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

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

  • 从服务端代码和客户端引用该程序集。在这种情况下,当您准备创建客户机代理时,您提到的那些类型已经存在,WCF将很高兴地从该程序集中重用这些类型。由于您正在引用的是.NET程序集,所以其中可以包含.NET支持的任何内容,包括接口


谢谢marc_s我会尝试这种方法。谢谢marc_s的解释,我想ganeshran也在考虑类似的案例。目标不是通过服务方法将实现ISometype的foo实例传递给服务器,我想做的是避免服务使用者中的具体依赖关系;无需复制另一层中的所有对象并进行无休止的映射(automapper或其他),我使用的服务具有数百种类型和数千种属性。感谢Artem,但我的兴趣是让生成的类型也实现接口类型。我认为KnownTypes不会提供这种功能。