




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
WCF面向服务应用程序系列之五:契约版本管理版本相容性 WCF版本相容性:指WCF的服务端在更新为新版本的情况下,客户端对服务端的引用不进行更新到最新的服务端,而继续引用旧的服务端但不发性异常。WCF契约缺省是提供版本相容性支持的,所有的服务契约,数据契约与消息契约,都允许缺失、非必需(non-required)的数据存在;且可以忽略多余的数据;DataContractSerializer提供相容性支持;适当的变化并不会对现存的客户端或者服务端产生影响。 开发环境:Visual Studio 2010 + Net Framework 4.0。 服务契约的变化对客户端产生的影响如下:服务契约的变化对现存客户端的影响在操作签名上添加新的参数客户端不会被影响新的参数在服务中被初始化为缺省值从操作签名中删除参数客户端不会被影响客户端传递的多余参数将被忽略,这些数据在服务端被丢失修改参数类型如果从客户端进入的类型无法转换为参数的数据类型,将会抛出异常修改返回数值的类型如果从服务端返回的值无法转换为在客户端操作签名中所期望的数据类型,那么将会抛出异常添加新的操作客户端不会被影响由于客户端不知道新加入操作的存在,因此其不会被调用删除操作抛出异常客户端发送给服务端的消息会被认为使用了未知的action头 数据契约为变化对客户端产生的影响如下:数据契约的变化对现存客户端的影响添加新的non-required成员客户端不会被影响缺少的数值将会被初始化为缺省值添加新的required成员对于缺少的值,将会抛出异常删除non-required成员服务端数据丢失无法将全部数据集返回给客户端不会抛出异常删除required成员当客户端收到来自服务端带有缺失数据的响应时,将会抛出异常修改已存的成员的数据类型如果类型兼容,那么不会产生异常,但是可能会导致未知的结果下面通过DEMO来演示服务端数据契约的变化对现存客户端的影响: 1、新增一个WCF Service Library程序,修改解决方案名称为ContractVersion,修改项目名称为ExplicitContract,删除自动添加的文件。 2、新建Item.cs类,代码如下: DataContract(Name = ItemContract, Namespace = /demos/ExplicitContract) public class Item DataMember(Name = IdContract, IsRequired = true, Order = 0) public int Id get; set; DataMember(Name = NameContract, IsRequired = true, Order = 1) public string Name get; set; DataMember(Name = MessageContract, IsRequired = true, Order = 2) public string Message get; set; /* / / 使用IsRequired = true :重新生成服务端代码,客户端不更新服务,则会引发异常 / 使用IsRequired = false:重新生成服务端代码,客户端不更新服务,则不会引发异常 / DataMember(Name = CreateDateContract, IsRequired = true, Order = 3) /DataMember(Name = CreateDateContract, IsRequired = false, Order = 3) public DateTime CreateDate get; set; */ 注意注释部分。 3、创建服务接口文件IExplicitService.cs,代码如下: ServiceContract(Name = ExplicitServiceContract, Namespace = /demos/ExplicitContract) public interface IExplicitService OperationContract(Name = SaveItemContract) void SaveItem(Item item); OperationContract(Name = GetItemContract) Item GetItem(); 4、创建ExplicitService.cs类文件,代码如下: public class ExplicitService : IExplicitService private Item _item; public void SaveItem(Item item) this._item = item; public Item GetItem() this._item.Message = IExplicitService.GetItem() invoked.; return this._item; 5、修改App.config中的服务名称 、端点契约、服务地址,代码如下:代码 6、创建客户端控制台程序Client,添加Service Reference,修改名称空间为TestExplicitContract,并添加测试TestExplicitContract方法,代码如下:代码 class Program static void Main(string args) TestExplicitContract(); private static void TestExplicitContract() 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, others 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); Console.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.WriteLine( ); 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 to close the client, others continue.); readValue = Console.ReadLine(); client.Close(); Console.WriteLine(-Test ExplicitContract End-); private static int GetInt(object obj) int i = 0; if (obj != null) int.TryParse(obj.ToString(), out i); return i; 7、设置Client为启动项目,运行调试ExplicitContract程序,然后,将在控制台看到如下输出:-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 : xinhaijulanGet 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=false,重新生成服务端Explici
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 食品销售风险分级管理工作方案
- 煤矿安全生产百日会战实施方案
- 幼儿园元旦节创意策划方案
- 银行反诈宣传课件
- 银孚郑聪聪消防课件
- 中国激光全息综合防伪标识行业投资研究分析及发展前景预测报告
- 学年度学校教育教学工作总结
- 团体举办的春节主题活动方案模板
- 小规模羽毛球赛方案范本
- 2025年中国干式电抗器行业市场发展监测及投资潜力预测报告
- 仪器仪表制造工(高级)考试题库及答案
- 横纹肌溶解症的护理
- 2023年度湖北省政府采购评审专家资格高分通关题型题库附解析答案
- 老旧小区PE管道改造方案
- 2024北京西城初二(上)期末语文试卷及答案
- 《城市轨道交通不间断电源(UPS)整合设计规范》
- 2025高考数学专项复习:马尔科夫链(含答案)
- 管廊钢结构防火涂料施工方案
- 不窜货保证书
- 《提高利润的78个方法》
- DB34T 3663-2020 植保无人飞机农田施药作业技术规范
评论
0/150
提交评论