WCF面向服务应用程序系列之五:契约版本管理-版本相容性_第1页
WCF面向服务应用程序系列之五:契约版本管理-版本相容性_第2页
WCF面向服务应用程序系列之五:契约版本管理-版本相容性_第3页
WCF面向服务应用程序系列之五:契约版本管理-版本相容性_第4页
WCF面向服务应用程序系列之五:契约版本管理-版本相容性_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 HYPERLINK /xinhaijulan/archive/2010/10/09/1846344.html WCF面向服务应用程序系列之五:契约版本管理版本相容性 WCF版本相容性:指WCF的服务端在更新为新版本的情况下,客户端对服务端的引用不进行更新到最新的服务端,而继续引用旧的服务端但不发性异常。WCF契约缺省是提供版本相容性支持的,所有的服务契约,数据契约与消息契约,都允许缺失、非必需(non-required)的数据存在;且可以忽略多余的数据;DataContractSerializer提供相容性支持;适当的变化并不会对现存的客户端或者服务端产生影响。 开发环境:Visual St

2、udio 2010 + Net Framework 4.0。 服务契约的变化对客户端产生的影响如下:服务契约的变化对现存客户端的影响在操作签名上添加新的参数客户端不会被影响新的参数在服务中被初始化为缺省值从操作签名中删除参数客户端不会被影响客户端传递的多余参数将被忽略,这些数据在服务端被丢失修改参数类型如果从客户端进入的类型无法转换为参数的数据类型,将会抛出异常修改返回数值的类型如果从服务端返回的值无法转换为在客户端操作签名中所期望的数据类型,那么将会抛出异常添加新的操作客户端不会被影响由于客户端不知道新加入操作的存在,因此其不会被调用删除操作抛出异常客户端发送给服务端的消息会被认为使用了未知

3、的action头 数据契约为变化对客户端产生的影响如下:数据契约的变化对现存客户端的影响添加新的non-required成员客户端不会被影响缺少的数值将会被初始化为缺省值添加新的required成员对于缺少的值,将会抛出异常删除non-required成员服务端数据丢失无法将全部数据集返回给客户端不会抛出异常删除required成员当客户端收到来自服务端带有缺失数据的响应时,将会抛出异常修改已存的成员的数据类型如果类型兼容,那么不会产生异常,但是可能会导致未知的结果下面通过DEMO来演示服务端数据契约的变化对现存客户端的影响: 1、新增一个WCF Service Library程序,修改解决方

4、案名称为ContractVersion,修改项目名称为ExplicitContract,删除自动添加的文件。 2、新建Item.cs类,代码如下: DataContract(Name = ItemContract, Namespace = /demos/ExplicitContract) publicclass Item DataMember(Name = IdContract, IsRequired = true, Order = 0) publicint Id get; set; DataMember(Name = NameContract, IsRequired = true, Orde

5、r = 1) publicstring Name get; set; DataMember(Name = MessageContract, IsRequired = true, Order = 2) publicstring Message get; set; /* / / 使用IsRequired = true :重新生成服务端代码,客户端不更新服务,则会引发异常 / 使用IsRequired = false:重新生成服务端代码,客户端不更新服务,则不会引发异常 / DataMember(Name = CreateDateContract, IsRequired = true, Order

6、= 3) /DataMember(Name = CreateDateContract, IsRequired = false, Order = 3) public DateTime CreateDate get; set; */ 注意注释部分。 3、创建服务接口文件IExplicitService.cs,代码如下: ServiceContract(Name = ExplicitServiceContract, Namespace = /demos/ExplicitContract) publicinterface IExplicitService OperationContract(Name

7、= SaveItemContract) void SaveItem(Item item); OperationContract(Name = GetItemContract) Item GetItem(); 4、创建ExplicitService.cs类文件,代码如下:publicclass ExplicitService : IExplicitService private Item _item; publicvoid SaveItem(Item item) this._item = item; public Item GetItem() this._item.Message = IExpl

8、icitService.GetItem() invoked.; returnthis._item; 5、修改App.config中的服务名称 、端点契约、服务地址,代码如下:代码 6、创建客户端控制台程序Client,添加Service Reference,修改名称空间为TestExplicitContract,并添加测试TestExplicitContract方法,代码如下:代码class Program staticvoid Main(string args) TestExplicitContract(); privatestaticvoid TestExplicitContract()

9、Console.WriteLine(-Test ExplicitContract Begin-); ExplicitContract.ExplicitServiceContractClient client = new ExplicitContract.ExplicitServiceContractClient(); /ExplicitDataContract ExplicitContract.ItemContract item = null; string readValue = ; Console.WriteLine(Input exit to close the client, othe

10、rs continue.); readValue = Console.ReadLine(); while (readValue != exit) /ExplicitDataContract item = new ExplicitContract.ItemContract(); Console.WriteLine(Please input the id:); item.IdContract = GetInt(Console.ReadLine(); Console.WriteLine(You have input item.IdContract:0, item.IdContract); Conso

11、le.WriteLine(Please input the name:); item.NameContract = Console.ReadLine(); Console.WriteLine(You have input item.NameContract:0, item.NameContract); /ExplicitServiceContract client.SaveItemContract(item); /ExplicitServiceContract item = client.GetItemContract(); if (item != null) Console.WriteLin

12、e( ); Console.WriteLine(Get from server item.IdContract is : 0, item.IdContract); Console.WriteLine(Get from server item.NameContract is : 0, item.NameContract); Console.WriteLine(Get from server item.MessageContract is : 0, item.MessageContract); Console.WriteLine(-); Console.WriteLine(Input exit t

13、o close the client, others continue.); readValue = Console.ReadLine(); client.Close(); Console.WriteLine(-Test ExplicitContract End-); privatestaticint GetInt(object obj) int i = 0; if (obj != null) int.TryParse(obj.ToString(), out i); return i; 7、设置Client为启动项目,运行调试ExplicitContract程序,然后,将在控制台看到如下输出:

14、-Test ExplicitContract Begin-Input exit to close the client, others continue.Please input the id:88You have input item.IdContract:88Please input the name:xinhaijulanYou have input item.NameContract:xinhaijulanGet from server item.IdContract is : 88Get from server item.NameContract is : xinhaijulanGe

15、t from server item.MessageContract is : IExplicitService.GetItem() invoked.-Input exit to close the client, others continue. 8、修改Item.cs中的代码,把注释去掉,新增属性:CreateDate,且使用IsRequired=true,重新生成服务端ExplicitContract项目,不更新客户端Service Reference,设置Client为启动项目,运行调试ExplicitContract程序,然后,将看到如下异常: 9、修改Item.cs中的代码,把注释去掉,新增属性:CreateDate,且使用IsRequired

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论