WCF入门 (13)
前言
公司略无聊,周三前同事推荐跳槽,于是会去更新了一下简历,突然发现,快一年了,我竟然想不出我可以往简历上添加点什么值得自豪的东西。下午和小伙伴聊了一会天,他告诉我,可以往简历上写上“英语口语水平有提高”,惭愧。。。
希望自己跳槽成功。
言归正传,几天第13集。
第13集 ExtensionDataObject in WCF WCF里的ExtensionDataObject
这集讲的是WCF里面的ExtenstionDataObject。 简单来说, ExtenstionDataObject用来保存DataContacts在序列化和反序列化时候的未知的元素。在服务端,当服务端接收到来自客户端的未知元素内容时,这些内容会被存在ExtenstionDataObject里面。在往客户端发送数据的时候,服务必须把数据序列化为XML,这时候服务的序列化进程就会取出ExtensionDataObject里面的内容,然后把他们序列化到XML里面一起发送给客户端。
下面我们通过一个例子来解释说明一下。
1。 我们来看一下修改过的Employee DataContract类。
[DataContract]
public class Employee : IExtensibleDataObject
{
[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; } public ExtensionDataObject ExtensionData { get; set; }
}
这里有两点改变,①注释了一个属性Name,②DataContract类实现了IExtensibleDataObject接口,这个接口里定义了一个属性,ExtensionData属性。
因为拿掉了Gender属性,GetEmployee 和 SaveEmployee方法,以及存储过程要稍作修改。这里不说明了。
2。 然后我们把服务端Run起来。

3。 再把客户端Run起来。
先看看我们数据库里有多少数据:

总共一条。
然后运行一下客户端的查找方法。

因为Name属性被注释了,所以从查找出来的结果Name的textbox为空。
3。 下面我们新保存一个Employee。

如图显示保存成功,但是很明显,数据库里面的Name一定是Null。

这个Name的Value消失了,如果我们想再获取这个Name的Value,我们应该怎么做? 下面今天的主角登场。 我们来对代码做一些修改。
4。 首先我们对EmployeeService增加一个lastSavedEmployee内部变量。
private static Employee lastSavedEmployee;
这个用来保存最近一次保存的Employee实力。
5。然后是SaveEmployee方法,只需加一句话。
public bool SaveEmployee(Employee emp)
{
lastSavedEmployee = emp;
var connStr = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;
using(var conn = new SqlConnection(connStr)) {
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "spSaveEmployee";
cmd.Parameters.Add(new SqlParameter("id", emp.Id));
//cmd.Parameters.Add(new SqlParameter("name", emp.Name));
cmd.Parameters.Add(new SqlParameter("gender", emp.Gender));
cmd.Parameters.Add(new SqlParameter("dateOfBirth", emp.DateOfBirth));
cmd.Parameters.Add(new SqlParameter("employeeType", emp.EmployeeType));
return cmd.ExecuteNonQuery() == 1;
}
}
就第一句,每次在save的时候都把lastSavedEmployee更新为传入的emp(这里默认每次都是保存成功的 o(∩_∩)o )
6。 然后是GetEmployee方法,
public Employee GetEmployeeById(int id)
{
var connStr = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;
using(var conn = new SqlConnection(connStr)) {
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "spGetEmployeeById";
cmd.Parameters.Add(new SqlParameter("id", id)); Employee emp = null;
var reader = cmd.ExecuteReader();
emp = reader.HasRows ? new Employee() : null;
while(reader.Read()) {
emp.Id = Convert.ToInt32(reader["Id"]);
//emp.Name = Convert.ToString(reader["Name"]);
emp.Gender = Convert.ToBoolean(reader["Gender"]);
emp.DateOfBirth = Convert.ToDateTime(reader["DateOfBirth"]);
emp.EmployeeType = Convert.ToInt16(reader["EmployeeType"]);
}
if(lastSavedEmployee != null && lastSavedEmployee.Id == id) {
emp.ExtensionData = lastSavedEmployee.ExtensionData;
}
return emp;
}
}
我们来看一下return前面的那个if语句块, 如果lastSavedEmployee不为空,并且lastSaveEmployee的id和传入的id是同一个,那么就复制return的emp的ExtenstionData属性为lastSavedEmployee的ExtentionData属性。
我们来做个测试。按下图保存一个Employee。

然后在SaveEmployee里面的第一句给lastSavedEmployee句子打个断点。添加一个监视,来看看我们可以拿到什么。

展开ExtentionData属性,里面有个Members属性,是个集合。Name为“Name”,Value为“TestName”,也就是我们输入的值。
点击保存,提示保存成功,check一下数据库里面的值。

Name为Null。
7。然后我们调用一下查找方法。
输入Id=3.

可以看到,TestName这个值虽然没有存入数据库,但还是被Preserve下来了。
这集介绍了IExtensibleDataObject接口,因为本身也没有太多WCF项目的经验,所以暂时也不晓得这个东西在什么业务场景下比较给力。希望有经验的同学给举个好点的例子。
Thank you。
WCF入门 (13)的更多相关文章
- WCF入门(22)
前言 本还想写一集WCF入门教程的,心情实在不好,明天又还有面试,改天再写吧. 说一下今天遇到的入职坑.面试能坑,上班能坑,完全没想到入职也能坑.切身经历. 今年10月份想换工作,更新了一下简历,接到 ...
- 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 ...
随机推荐
- 恶意IP远程登录Linux服务器脚本
#!/bin/sh #auto drop ssh failed IP address #定义变量 SEC_FILE=/var/log/secure #如下为截取secure文件恶意ip 远程登录22端 ...
- 关于HADOOP HA 中DFSZKFC的理解
[转自uc技术博客:http://tech.uc.cn/?p=252] FC是要和NN一一对应的,两个NN就要部署两个FC.它负责监控NN的状态,并及时的把状态信息写入ZK.它通过一个独立线程周期性的 ...
- Web安全--XSS模版
[XSS基本探测pyload] <script>alert("xss")</script> <script>alert(/xss/)< ...
- [转]微服务(Microservice)那点事
WHAT – 什么是微服务 微服务简介 这次参加JavaOne2015最大的困难就是听Microservice相关的session,无论内容多么水,只要题目带microservice,必定报不上名,可 ...
- Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- ClickJacking(点击劫持)
问题: 点击劫持(ClickJacking)是一种视觉上的欺骗手段.大概有两种方式,一是攻击者使用一个透明的iframe,覆盖在一个网页上,然后诱使用户在该页面上进行操作,此时用户将在不知情的情况下点 ...
- Difference Between TIF and TIFF
TIF vs TIFF Many people are confused with similar file extensions that only differ by a single lette ...
- [iOS翻译]《iOS 7 Programming Cookbook》:iOS文件与文件夹管理(上)
简介: iOS基于OS X,而OSX本身基于Unix操作系统.在iOS里面,操作系统的完全路径结构是不可见的,因为每个APP的数据都存储自身的沙盒里面.沙盒环境实际上听起来像这样:一个只允许当前APP ...
- MVC3学习:利用mvc3+ajax实现登录
用到的工具或技术:vs2010,EF code first,JQuery ajax,mvc3. 第一步:准备数据库. 利用EF code first,先写实体类,然后根据实体类自动创建数据库:或者先创 ...
- 实现chrome扩展启动本地进程 - 补充
实现chrome扩展启动本地进程 - 补充 标签: chrome扩展启动本地程序访问本地磁盘 2014-10-17 11:42 6753人阅读 评论(17) 收藏 举报 分类: Chrome Plu ...