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
WCF入门(12)的更多相关文章
- WCF入门教程(图文)VS2012
WCF入门教程(图文)VS2012 上一遍到现在已经有一段时间了,先向关注本文的各位“挨踢”同仁们道歉了.小生自认为一个ITer如果想要做的更好,就需要将自己的所学.所用积极分享出来,接收大家的指导和 ...
- WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]
WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...
- 【转】WCF入门教程六[一个简单的Demo]
一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...
- 学习WCF入门的第一个实例
一.概述 WCF说白了就是一个基于终结点的通信手段!就是Service端提供一定的功能实现,然后暴露出一个或多个终结点,Client端调用Service端的功能(可以理解为调用一个函数),那么Clie ...
- WCF入门教程(五)配置文件
WCF入门教程(五)配置文件 服务协定以及实现写好后,需要将相关服务公布出去,就需要HOST来承载,供客户端来调用. 承载服务有两种方式,一种通过配置文件,一种通过代码进行配置.上一章已经介绍了代码方 ...
- WCF入门教程(四)通过Host代码方式来承载服务
WCF入门教程(四)通过Host代码方式来承载服务 之前已经讲过WCF对外发布服务的具体方式. WCF入门教程(一)简介 Host承载,可以是web,也可以是控制台程序等等.比WebService有更 ...
- WCF入门教程(三)定义服务协定--属性标签
WCF入门教程(三)定义服务协定--属性标签 属性标签,成为定义协议的主要方式.先将最简单的标签进行简单介绍,以了解他们的功能以及使用规则. 服务协定标识,标识哪些接口是服务协定,哪些操作时服务协定的 ...
- WCF入门教程(二)如何创建WCF服务
WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...
- WCF入门教程(一)简介
WCF入门教程(一)简介 1.WCF是什么? WCF( Windows Communication Foundation), 是Microsoft为构建面向服务的应用提供的分布式通信编程框架,是.NE ...
- [WCF编程]1.WCF入门示例
一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...
随机推荐
- [学习嵌入式开发板]iTOP-4412实现NFS网络文件系统
本文转自迅为:http://www.topeetboard.com 学习平台:iTOP-4412开发板 本文讲解如何在 iTOP-4412 开发板上实现 NFS 网络文件系统. 我们使用的软硬件环境是 ...
- Linux 系统常用命令汇总(五) 磁盘管理
磁盘管理 命令 选项 注解 示例 df [选项] 显示磁盘空间使用情况 显示磁盘空间是员工情况,以M显示: df -m -i 使用inodes显示结果 -k(m) 使用KB(MB)显示结果 du ...
- [ubuntu]deb软件源
虽然ubuntu的中国服务器的速度已经非常不错,但是难免,会有网络不畅的情形,所以修改软件源地址是一个基础的知识点. 修改ubuntu的软件源的方式有多种,一直是通过ubuntu软件中心提供的UI,还 ...
- UESTC 898 方老师和缘分 --二分图匹配+强连通分量
这题原来以为是某种匹配问题,后来好像说是强连通的问题. 做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u-> ...
- Dijkstra求最短路径
单源点的最短路径问题:给定带权有向图G和源点V,求从V到G中其余各顶点的最短路径 Dijkstra算法描述如下: (1)用带权的邻接矩阵arcs表示有向图,arcs[i][j]表示弧<vi,vj ...
- zstu-3769 数回文子串
思路:用manacher求出每个位置的半径,相加即可. 代码:[rad[i]/2]即i这个位置的回文半径,添加的'#'代表长度为偶数的串. #include<stdio.h> #inclu ...
- Android 动态加载 (一) 态加载机制 案例一
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...
- C和指针笔记 3.7 存储类型
变量的破碎类型是指存储变量值的内存类型.变量的存储类型决定变量何时创建.何时销毁以及它的值将保持多久. 有三个地方可以用于存在变量:普通内存.运行时堆栈.硬件寄存器. 变量的缺省存储类型取决于它的声明 ...
- ArcGis实现添加MultiLayerMarkerSymbol(多个符号叠加生成新的符号)
, , ); pMarkerSymbol.Angle = ; pMarkerSymbol.XOffset = ;;;;, , ); ...
- NSURLSession学习笔记
NSURLSession学习笔记(一)简介 一.URL Session的基本概念 1.三种工作模式: 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁 ...