您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > WCF面向服务应用程序系列之五:契约版本管理—版本相容性
WCF面向服务应用程序系列之五:契约版本管理—版本相容性WCF版本相容性:指WCF的服务端在更新为新版本的情况下,客户端对服务端的引用不进行更新到最新的服务端,而继续引用旧的服务端但不发性异常。WCF契约缺省是提供版本相容性支持的,所有的服务契约,数据契约与消息契约,都允许缺失、非必需(non-required)的数据存在;且可以忽略多余的数据;DataContractSerializer提供相容性支持;适当的变化并不会对现存的客户端或者服务端产生影响。开发环境:VisualStudio2010+NetFramework4.0。服务契约的变化对客户端产生的影响如下:服务契约的变化对现存客户端的影响在操作签名上添加新的参数客户端不会被影响新的参数在服务中被初始化为缺省值从操作签名中删除参数客户端不会被影响客户端传递的多余参数将被忽略,这些数据在服务端被丢失修改参数类型如果从客户端进入的类型无法转换为参数的数据类型,将会抛出异常修改返回数值的类型如果从服务端返回的值无法转换为在客户端操作签名中所期望的数据类型,那么将会抛出异常添加新的操作客户端不会被影响由于客户端不知道新加入操作的存在,因此其不会被调用删除操作抛出异常客户端发送给服务端的消息会被认为使用了未知的action头数据契约为变化对客户端产生的影响如下:数据契约的变化对现存客户端的影响添加新的non-required成员客户端不会被影响缺少的数值将会被初始化为缺省值添加新的required成员对于缺少的值,将会抛出异常删除non-required成员服务端数据丢失无法将全部数据集返回给客户端不会抛出异常删除required成员当客户端收到来自服务端带有缺失数据的响应时,将会抛出异常修改已存的成员的数据类型如果类型兼容,那么不会产生异常,但是可能会导致未知的结果下面通过DEMO来演示服务端数据契约的变化对现存客户端的影响:1、新增一个WCFServiceLibrary程序,修改解决方案名称为ContractVersion,修改项目名称为ExplicitContract,删除自动添加的文件。2、新建Item.cs类,代码如下:[DataContract(Name=ItemContract,Namespace=)]publicclassItem{[DataMember(Name=IdContract,IsRequired=true,Order=0)]publicintId{get;set;}[DataMember(Name=NameContract,IsRequired=true,Order=1)]publicstringName{get;set;}[DataMember(Name=MessageContract,IsRequired=true,Order=2)]publicstringMessage{get;set;}/*///summary///使用IsRequired=true:重新生成服务端代码,客户端不更新服务,则会引发异常///使用IsRequired=false:重新生成服务端代码,客户端不更新服务,则不会引发异常////summary[DataMember(Name=CreateDateContract,IsRequired=true,Order=3)]//[DataMember(Name=CreateDateContract,IsRequired=false,Order=3)]publicDateTimeCreateDate{get;set;}*/}注意注释部分。3、创建服务接口文件IExplicitService.cs,代码如下:[ServiceContract(Name=ExplicitServiceContract,Namespace=)]publicinterfaceIExplicitService{[OperationContract(Name=SaveItemContract)]voidSaveItem(Itemitem);[OperationContract(Name=GetItemContract)]ItemGetItem();}4、创建ExplicitService.cs类文件,代码如下:publicclassExplicitService:IExplicitService{privateItem_item;publicvoidSaveItem(Itemitem){this._item=item;}publicItemGetItem(){this._item.Message=IExplicitService.GetItem()invoked.;returnthis._item;}}5、修改App.config中的服务名称、端点契约、服务地址,代码如下:代码?xmlversion=1.0encoding=utf-8?configurationsystem.webcompilationdebug=true//system.web!--Whendeployingtheservicelibraryproject,thecontentoftheconfigfilemustbeaddedtothehost'sapp.configfile.System.Configurationdoesnotsupportconfigfilesforlibraries.--system.serviceModelservicesservicename=ExplicitContract.ExplicitServicehostbaseAddressesaddbaseAddress=!--ServiceEndpoints--!--Unlessfullyqualified,addressisrelativetobaseaddresssuppliedabove--endpointaddress=binding=wsHttpBindingcontract=ExplicitContract.IExplicitService!--Upondeployment,thefollowingidentityelementshouldberemovedorreplacedtoreflecttheidentityunderwhichthedeployedserviceruns.Ifremoved,WCFwillinferanappropriateidentityautomatically.--identitydnsvalue=localhost//identity/endpoint!--MetadataEndpoints--!--TheMetadataExchangeendpointisusedbytheservicetodescribeitselftoclients.--!--Thisendpointdoesnotuseasecurebindingandshouldbesecuredorremovedbeforedeployment--endpointaddress=mexbinding=mexHttpBindingcontract=IMetadataExchange//service/servicesbehaviorsserviceBehaviorsbehavior!--Toavoiddisclosingmetadatainformation,setthevaluebelowtofalseandremovethemetadataendpointabovebeforedeployment--serviceMetadatahttpGetEnabled=True/!--Toreceiveexceptiondetailsinfaultsfordebuggingpurposes,setthevaluebelowtotrue.Settofalsebeforedeploymenttoavoiddisclosingexceptioninformation--serviceDebugincludeExceptionDetailInFaults=False//behavior/serviceBehaviors/behaviors/system.serviceModel/configuration6、创建客户端控制台程序Client,添加ServiceReference,修改名称空间为TestExplicitContract,并添加测试TestExplicitContract方法,代码如下:代码classProgram{staticvoidMain(string[]args){TestExplicitContract();}privatestaticvoidTestExplicitContract(){Console.WriteLine(-----------------TestExplicitContractBegin-----------------);ExplicitContract.ExplicitServiceContractClientclient=newExplicitContract.ExplicitServiceContractClient();//ExplicitDataContractExplicitContract.ItemContractitem=null;stringreadValue=;Console.WriteLine(Inputexittoclosetheclient,otherscontinue.);readValue=Console.ReadLine();while(readValue!=exit){//ExplicitDataContractitem=newExplicitContract.ItemContract();Console.WriteLine(Pleaseinputtheid:);item.IdContract=GetInt(Console.ReadLine());Console.WriteLine(Youhaveinputitem.IdContract:{0},item.IdContract);Console.WriteLine(Pleaseinputthename:);item.NameContract=Console.ReadLine();Console.WriteLine(Youhaveinputitem.NameContract:{0},item.NameContract);//ExplicitServiceContractclient.SaveItemContract(item);//ExplicitServiceContractitem=client.GetItemContract();if(item!=null){Console.WriteLine();Console.WriteLine(Getfromserveritem.IdContractis:{0},item.IdContract);Console.WriteLine(Getfromserveritem.NameContractis:{0},item.NameContract);Console.WriteLine(
本文标题:WCF面向服务应用程序系列之五:契约版本管理—版本相容性
链接地址:https://www.777doc.com/doc-1580687 .html