Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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中DataContract/ServiceContract的版本控制_C#_Wcf - Fatal编程技术网

C# WCF中DataContract/ServiceContract的版本控制

C# WCF中DataContract/ServiceContract的版本控制,c#,wcf,C#,Wcf,我们已经以一定的数据合同和服务合同向生产部门提供了WCF服务。 但是现在我们需要对SeriveContract和DataContract都做一些更改。我们的一个消费者没有能力更新合同。但我们需要在同一地址上支持旧客户端和新客户端。怎么做 旧合同: [ServiceContract] public interface ICoolerService { [OperationContract] IEnumerable<Cooler> Get(IEnumerable<

我们已经以一定的数据合同和服务合同向生产部门提供了WCF服务。 但是现在我们需要对SeriveContract和DataContract都做一些更改。我们的一个消费者没有能力更新合同。但我们需要在同一地址上支持旧客户端和新客户端。怎么做

旧合同:

[ServiceContract]
public interface ICoolerService
{
     [OperationContract]
     IEnumerable<Cooler> Get(IEnumerable<int> ids)
}
[ServiceContract]
public interface ICoolerService
{
     [OperationContract]
     IEnumerable<Cooler> Get(IEnumerable<CoolerRequest> req)
}

[DataContract]
public class CoolerRequest
{
     [DataMember]
     public int Id { get; set; }
     //and some more properties
}
[服务合同]
公共接口ICoolerService
{
[经营合同]
IEnumerable Get(IEnumerable ID)
}
新合同:

[ServiceContract]
public interface ICoolerService
{
     [OperationContract]
     IEnumerable<Cooler> Get(IEnumerable<int> ids)
}
[ServiceContract]
public interface ICoolerService
{
     [OperationContract]
     IEnumerable<Cooler> Get(IEnumerable<CoolerRequest> req)
}

[DataContract]
public class CoolerRequest
{
     [DataMember]
     public int Id { get; set; }
     //and some more properties
}
[服务合同]
公共接口ICoolerService
{
[经营合同]
IEnumerable Get(IEnumerable req)
}
[数据合同]
公共类CoolerRequest
{
[数据成员]
公共int Id{get;set;}
//还有更多的财产
}

请建议如何在同一uri上支持两个契约。

您不能保留旧的重载吗

[ServiceContract]
public interface ICoolerService
{
     [OperationContract]
     IEnumerable<Cooler> Get(IEnumerable<int> ids);

     [OperationContract]
     IEnumerable<Cooler> Get(IEnumerable<CoolerRequest> req);
}
[服务合同]
公共接口ICoolerService
{
[经营合同]
IEnumerable Get(IEnumerable id);
[经营合同]
IEnumerable-Get(IEnumerable-req);
}
请参见

它讨论了为新操作使用服务契约继承
还有关于修改现有操作和数据契约

这行不通。它将编译,但在运行时调用该操作契约时会抛出异常。不幸的是,它不起作用。当服务启动时,我有一个异常:不能在同一个协定中有两个同名的操作,类型为CoolerService.ICoolerService的方法Get和Get违反了此规则。您可以通过更改方法名称或使用OperationContractAttribute的name属性来更改其中一个操作的名称。听起来这就是您的答案:如果您不能有两个同名的服务,那么您必须更改其中一个。为什么不能更改新服务的名称?它将破坏uri的格式良好的逻辑路径。我们希望将来只有一个版本,而且我们的uri中不会有前缀c/v1/和/v2/,这是管理层的要求。当然,如果不可能,我们将更改uri…其中一种方法是使用make方法返回合同版本。若比客户端保存的更新,则自动将新引用的更新下载到客户端。我们正在使用它,它工作得非常好。每个客户端都有实际的版本。不幸的是,我们没有访问客户端代码:(因此,这是不可能的。如果您在服务器端更改合同,并且希望在客户端使用更改,则必须在客户端更新引用。我不需要添加操作,我需要更改它,但希望避免对旧客户端进行警告。