WCF架构与演进,版本本题围绕着如何构建WCF服务,随着时间的推移变得容易。如果不描述问题,就很难得到对此的回应的深度。背景我正在开发一个大型的WCF服务和客户端系统。服务器端很“容易”更新,因为只有10台服务器运行此代码。客户端很难更新,尽管自动化水平很高,但在超过300,000个WCF客户端中,更新总是需要时间,并且只有在两到三周的时间内才能实现较高的更新成功率。数据契约[DataContract]publicclassMyContract{[DataMember]publicintIdentity{get;放;}[DataMember]publicstringName{get;放;}//更多成员}DataContract很难初始化,并且有一个标准的MyContractFactory类来为您的机器初始化适当的实例。publicclassstaticMyContractFactory{publicstaticMyContractGetMyContract(){//Compleximplementation}}ServiceContractsDataContracts在一系列网络服务中非常常见。namespaceMyPrefix.WebServicve1{[ServiceContract]publicclassIMyInterface1{[OperationContract]publicvoidDoSomethingWithMyContract(MyContractdata);}[ServiceContract]publicclassIMyInterface2{[OperationContract]publicvoidDoSomethingDifferentWithMyContract(;MyContract}data)插件,插件在单独的进程或应用程序域中运行,具体取决于我们对该插件的信任级别。实施1我对此(默认WCF)的初始实施在一个程序集中以DataContract结束,在我自己的程序集中以ServiceContract和实施结束。客户端最终变得非常丑陋,几乎在每个插件中都将MyContractFactory从MyWebService1.MyContract复制并粘贴到MyWebService2.MyContract。尽管DataContract是相同的,但客户端不包含DataContract程序集这一事实意味着它在不同的命名空间下显示为不同的对象。实现2客户端现在包含DataContract程序集,ServiceContracts位于与服务实现分开的程序集中,如果它有助于代码重用(不再复制和粘贴),客户端可能包含一些ServiceContract程序集。问题在第二种实现中,我现在面临的困难是,如何更新我的DataContract和ServiceContracts?我是否更新同一个程序集并增加版本号?在升级所有客户端时如何保持向后兼容性?在客户端更新之前中断客户端是不可接受的。我是否创建一个新程序集,其中包含一个扩展MyDataContract的类,该类接受新ServiceContract下的新类型的新方法?这是否意味着对我的合同的每一个微小改动都需要重新组装?我怎样才能阻止它在几年内达到数百?其他解决方案?无论我想到什么解决方案,它们似乎都有一个主要缺点。似乎没有(至少对我而言)操作合同复杂性[OperationContract]publicvoidDoSomethingWithMyContract(MyContractdata);[OperationContract(Name="DoSomethingWithMyDataByAdditionalData"]publicvoidDoSomethingWithMyContract(MyContractdata,MyContract2additionalData);在大规模环境中工作了一段时间的解决方案。非常欢迎博客条目等。更新1查看使用“的限制无模式”的变化,不同的命名空间似乎是唯一可靠的方式。但是,它没有按预期工作,例如下面的[ServiceContract(Name="IServiceContract",Namespace="http://myurl/2012/05")]publicinterfaceIServiceContract1{//一些操作}[ServiceContract(Name="IServiceContract",Namespace="http://myurl/2012/06")]publicinterfaceIServiceContract2{//使用新DataContracts的一些不同操作}有以下服务publicclassMyService:IServiceContract1,IServiceContract2{//实现这两个操作}和以下配置原来有两个不同名称的合同,我希望我可以将我的客户端http://myurl.com/MyService.svc/2012/05指向旧版本和http://myurl.com/MyService.svc/2012/06,但是好像我想保留ServiceContract名称,他们必须是两个独立的服务,而不是同一个服务的独立端点地址?更新2我最终使用了我在更新1中描述的方法。虽然WSDL看起来不对,但当我测试它时,该服务确实在旧客户端下向后兼容。Microsoft和最受尊敬的WCF专家可能会说同样的话:契约命名空间应该用于处理版本控制。我不是指程序集的.NET命名空间——我是指实际的WCF服务(和数据协定)命名空间——所以你应该:[ServiceContract(Namespace="http://services.yourcompany.com/Service1/V01"]或类似的东西-有些人喜欢按年/月的版本:[ServiceContract(Namespace="http://services.yourcompany.com/Service1/2012/05"]这允许您拥有同一服务的多个版本,并且只要客户端调用旧版本(由服务命名空间指示),他们将获得旧版本(只要你仍然暴露它。)请参阅:以上是关于C#学习教程:WCF体系结构和演变,版本分享,如果对你有用,需要了解更多C#学习教程,希望大家多多关注~本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处:
