WCF入门(12)

前言

  上次写是小半年前的事情了,还在原来的公司,还在原来的项目,同时认识了不少人。外包公司总是有些不适应的地方,总在很闲和很忙之间徘徊。凌晨2点被客户电话叫醒,只为copy一个文件从一台服务器到另一台服务器,虽然那时候我才刚睡下。似乎好想吐槽……罢了。

  项目中有个http转https的需求还是印象深刻的。首先是证书的问题,通过看作者的asp.net的视频了解到IIS有Self-Signed Certificate 的东西可以用来方便的在IIS上部署需要https访问的站点而不需要去其他地方申请。然后是如何对WCF进行https配置。这一 点在视频第52集有讲到。

言归正传。

第12集 Backward compatible WCF contract changes WCF合约改变后的向后兼容性

  这一集主要内容来自https://msdn.microsoft.com/en-us/library/ff384251.aspx ,所以可以直接看上面的链接。

  一般来说WCF服务部署到生产环境后,因为客户端的代理类已经生成,所以,服务端不建议再做更改。但总会有避免不了要更改的情况。下面就通过2个表格来对典型的情况做一些说明。简单来说,DataContractSerializer 允许一下情况

① 缺失非必须参数,

② 忽视多余的参数。

③ Only the removal of operations or the addition or removal of required data causes problems with existing clients. (没看懂。。。)

表1: Service Contract的向后兼容性


服务端合约改变


对现有客户端的影响


对原有的Operation也就是方法增加参数


没有影响,服务端会使用该参数的默认值


移除原有的Operation的某些参数


没有影响,服务端直接忽略


改变参数的类型


如果类型之间可以转换,比如short到int,就没有问题,但是如果是不可转换的类型,比如int到DateTime,客户端就会得到异常


改变方法的返回值类型


如果新的返回值类型不能转换为客户端需要的类型,客户端就会获取到异常,否则不会


增加新的Operation


客户端无法调用到,所以不会有影响


移除Operation


如果客户端继续调用被删除的方法,则会得到异常,(使用未知的action)

表2:Data Contract的向后兼容性


Data Contact改变


对现有客户端的影响


添加非必须的成员变量(System.Runtime.Serialization.DataMemberAttribute特性中IsRequired=False)


没有影响,值被初始化为默认值


添加必须的成员变量(System.Runtime.Serialization.DataMemberAttribute特性中IsRequired=True)


有异常


移除非必须的成员


没有异常,但是数据丢失,


移除必须的成员


客户端接收到的response不符合客户端的代理类合约定义,所以会获取的异常


修改现有成员的数据类型


看类型是否兼容,不兼容则有异常

下面对表2中的第2项做个test, 权当练练手。。

1. 首先给IEmployeeService 加个GetEmployeeInfo的OperationContract,然后在EmployeeService里面实现。

        public string GetEmployeeInfo(Employee emp)
        {
            return String.Format("name= {0}, id= {1}", emp.Name, emp.Id);
        }

因为要试验当一个DataContract 在Client不知情的情况下添加一个IsRequired的DataMember之后对Client的影响,所以,简单起见,就直接接收一个Employee的参数。

2. 下面是Employee的定义:

    [DataContract]
    public class Employee
    {
        [DataMember(IsRequired = true)]
        public int Id { get; set; }
        [DataMember(IsRequired = false)]
        public String Name { get; set; }
        [DataMember]
        public Boolean Gender { get; set; }
        [DataMember]
        public DateTime DateOfBirth { get; set; }
        [DataMember]
        public short EmployeeType { get; set; }
        //[DataMember(IsRequired = true)]
        //public string City { get; set; }
    }

注意, Emploee类要用DataContract特性修饰。 原先是不带City属性,下面给他添加IsRequired的属性。

    [DataContract]
    public class Employee
    {
        [DataMember(IsRequired = true)]
        public int Id { get; set; }
        [DataMember(IsRequired = false)]
        public String Name { get; set; }
        [DataMember]
        public Boolean Gender { get; set; }
        [DataMember]
        public DateTime DateOfBirth { get; set; }
        [DataMember]
        public short EmployeeType { get; set; }
        [DataMember(IsRequired = true)]
        public string City { get; set; }
    }

3. 启动Service

4. 打开EmployeeServiceClient项目,查看里面的Employee定义,因为City属性是后来加的,所以代理类里面不带City属性。

    [Serializable]
    [DataContract(Name = "Employee", Namespace = "http://schemas.datacontract.org/2004/07/EmployeeService")]
    [DebuggerStepThrough]
    [GeneratedCode("System.Runtime.Serialization", "4.0.0.0")]
    public class Employee : IExtensibleDataObject, INotifyPropertyChanged
    {
        public Employee();

        [DataMember]
        public DateTime DateOfBirth { get; set; }
        [DataMember]
        public short EmployeeType { get; set; }
        public ExtensionDataObject ExtensionData { get; set; }
        [DataMember]
        public bool Gender { get; set; }
        [DataMember(IsRequired = true)]
        public int Id { get; set; }
        [DataMember]
        public string Name { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged(string propertyName);
    }

5. 编写如下测试代码:

protected void btnTest_Click(object sender, EventArgs e)
    {
        try {
            var client = new EmployeeServiceClient();
            var emp = new Employee() { Name = "Lou" };
            lbRstMsg.Text = client.GetEmployeeInfo(emp);
        } catch(Exception ex) {
            lbRstMsg.Text = ex.Message;
        }
    }

6. 点击测试按钮 得到如下结果:

由ErrorMessage中可知,服务端想得到一个City,但是没有获取到这个参数由于我们的测试代码里面没有也不能提供这个参数。

Thank you。 就这样把。 最后说一句,要视频的进群378190436

时间: 09-16

WCF入门(12)的相关文章

WCF入门教程

无废话WCF入门教程一[什么是WCF] wcf问题有问必答,欢迎加群: 一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NET Framework 3.0 开始引入. WCF的最终目标是通过进程或不同的系统.通过本地网络或是通过Internet收发客户和服务之间的消息. WCF合并了Web服务..net Remoting.消息队列和Enterpris

【转】WCF入门教程六[一个简单的Demo]

一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来学习的,我们学习WCF也是一样的.从简单来看(不包括安全.优化等相关问题),WCF的增删改查和WebForm相差无几.WCF只是把具体"实现"写在"Service端",而"调用"放在了"Client端".觉得有帮助别忘了点个赞哈,

无废话WCF入门教程六[一个简单的Demo]

wcf技术交流,同学习,同进步. 群号:89718412 一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来学习的,我们学习WCF也是一样的.从简单来看(不包括安全.优化等相关问题),WCF的增删改查和WebForm相差无几.WCF只是把具体“实现”写在“Service端”,而“调用”放在了“Client端”.觉得有帮助别忘了点个赞哈,谢谢哦~ 二

WCF入门教程[WCF基本应用]

一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NET Framework 3.0 开始引入. WCF的最终目标是通过进程或不同的系统.通过本地网络或是通过Internet收发客户和服务之间的消息. WCF合并了Web服务..net Remoting.消息队列和Enterprise Services的功能并集成在Visual Studio中. WCF

WCF入门教程(三)属性标签

属性标签,成为定义协议的主要方式.先将最简单的标签进行简单介绍,以了解他们的功能以及使用规则. 服务协定标识,标识哪些接口是服务协定,哪些操作时服务协定的一部分,以及传输对象的定义.如果已经有所了解,请直接PASS. 1.ServiceContract(服务协定) 全名:System.ServiceModel.ServiceContractAttribute 功能:指示接口或类在应用程序中定义服务协定. 简单一句话:标识此接口是否是服务协定,是否需要公开为服务. 详细:使用接口(或类)上的 Se

WCF 入门(25,26,27,28)

前言 项目赶时间,工期紧,熬过这段时间应该就好了吧.希望如此. 今天把自己那部分写的差不多了,回来和小伙伴一起又看了一遍<夏洛特烦恼>,还挺好看的,明天继续加班,do it. 第25-28集 第25集讲的是如何用winform来host 一个WCF service. 第26集讲什么是windows 服务 第27集讲用windows 服务来host 一个WCF service. 第28集讲用windows 服务来host 一个WCF service的优缺点. 用console,winform 或

WCF入门(9)

前言 上次搬家空调出了点问题,和修空调的师傅商量了一下,感觉还是讲理的. 今天又在公司基本没有任何存在感的过了一天,纠结...领导还不在... 前些天往手机里面放了几集WCF入门视频,今天用暴风影音看了一下,发现极其不清楚,图像被严重压缩了,正愁是不是试试迅雷影音之类的软件时,想到了系统不是自带了播放器,一试,果然,效果不错. 最后再打一次广告,需要视频的,群号:378190436 第九集 How to enable tracing and message logging in WCF (如何在

WCF入门简单教程(图文) VS2010版

在这个例子中我们将使用VS 2010 创建一个WCF服务,其中会了解 [DataContract] [ServiceContract] 等特性.  内置的 WCFSVCHost ,并使用"WCF测试客户端"来测试我们创建的服务. 注意下面的所有类.接口及方法都添加了public 的访问级别. 一,建立一个WCF服务库 创建一个WCF服务库项目 在解决方案中会自动为我们生成两个类文件"IService1.cs"和"Service1.cs". 这两个

WCF入门教程(五)配置文件

WCF入门教程(五)配置文件 服务协定以及实现写好后,需要将相关服务公布出去,就需要HOST来承载,供客户端来调用. 承载服务有两种方式,一种通过配置文件,一种通过代码进行配置.上一章已经介绍了代码方式来架设服务. 当然配置文件的方式还是很灵活,应用广泛. 通过此文章具体介绍WCF如果通过配置文件的方式进行配置. 一.配置文件功能 需要配置服务的EndPoint,设置相关绑定协议以及服务协定,并且还可以限定其具体的行为等. 二.配置文件结构 主要配置内容包括service节点.binding和b

WCF入门教程(vs2010)

这几天挺别人提起WCF,鄙人之前只知道WPF,对WCF这个东东不甚了解,经过查阅网上的资料略有所得,和大家交流一下. 首先WCF是什么? Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口.官方的定义就是这些,我们需要知道的就是他是一个通讯接口,直白的说就是用于两者之间联系的工具. 这里有人能想到这和webSerivice不是一样的吗?直接看官方的一些对WCF的描述我想你就明白了. 在 .NET