Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
WCF-句柄版本控制_Wcf_Namespaces_Versioning_Contracts - Fatal编程技术网

WCF-句柄版本控制

WCF-句柄版本控制,wcf,namespaces,versioning,contracts,Wcf,Namespaces,Versioning,Contracts,如果我需要履行本服务合同: [ServiceContract(Namespace="http://api.x.com/Svc1")] public interface IService1 { [OperationContract(Name = "AddCustomer")] bool AddCustomer(DTOCustomer1 customer); } 为此: [ServiceContract(Namespace="http://api.x.com/Svc1")] publi

如果我需要履行本服务合同:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IService1
{
   [OperationContract(Name = "AddCustomer")]
   bool AddCustomer(DTOCustomer1 customer);
}
为此:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IService1
{
   [OperationContract(Name = "AddCustomer")]
   bool AddCustomer(DTOCustomer2 customer);
}
根据这篇好文章:我了解到,当数据契约发生更改时,需要在新名称空间中定义新的数据契约vs,然后在新名称空间中定义新的服务契约vs,之后应该添加新的端点

我到底该怎么做呢。有什么例子吗?你能根据我上面的服务合同写点什么吗


提前谢谢你

根据链接的文章,您应该做如下操作:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IServiceNew : IService1
{
   [OperationContract(Name = "AddCustomerNew")]
   bool AddCustomer(DTOCustomer2 customer);
}
然后在您的服务中实施它:

public class MyCurrentServiceImplementation : IServiceNew 
{...}

您需要重新部署您的服务,但现有客户应该能够继续调用AddCustomer操作,新客户可以调用AddCustomerNew操作。

请注意,您在帖子中陈述的假设非常重要:

“当数据契约更改时,需要定义新的vs “新命名空间中的数据协定”

事实并非总是如此。请参阅MSDN上的内容,了解数据契约更改不会破坏的情况,因此可能只需要修改服务方法的内部实现,以处理由于数据契约版本之间的差异而导致的某些数据的存在/不存在

在这个特定的示例中,我想问一个名为
AddCustomer
的方法的两个版本在意图上的差异如何如此之大,以至于有理由创建一个新的服务接口。如果没有看到您的新旧数据合同,我无法确定,但我猜这里的真正问题是,该方法已经演变为接受额外的客户信息

如果这是真的,那么它非常类似于方法调用中可选参数的情况。WCF被设计成可以很好地处理这个场景,作为数据契约的一个非破坏性更改。只要您能够遵循MSDN中的指导原则,那么您现有的服务接口将可以接受提供旧版或新版合同的呼叫。考虑到客户机和服务器数据契约的组合,您的服务方法将获得可能的数据


我会保持我的服务界面连贯、简单和干净(即避免做像IServiceNew这样的事情)相反,只需添加到数据契约中,并修改
AddCustomer
的实现,以适应它接收到的任何数据。

您也可以考虑通过在服务的URL链接中包含版本号来处理WCF版本控制。在WCF服务项目中,您也可以为每个版本使用不同的文件夹。@Dmitry:我觉得这很有趣。你能给我指出与此相关的链接吗?谢谢我不记得在哪里找到这个方法。。。但是这里有一些链接,非常感谢,非常感谢!是的,我一直在排队等着。剩下的就是为新的svc合同定义一个新的端点,对吗?是的,您应该在新端点上公开新的服务契约-这将使新操作可用如果“MyCurrentServiceImplementation”以前是:“MyCurrentServiceImplementation:IService1”现在将变成“MyCurrentServiceImplementation:IServiceNew”对吗?让我尝试一个简单的测试并接受您的答案。。。非常感谢,休!老实说,我不认为配置的重用会在很大程度上影响我必须做出的任何与服务组合相关的决策。