快速入门系列--WCF--02消息、会话与服务寄宿
经过WCF基础的ABC学习,已经可以构建简单的WCF的服务,使用不同的服务地址和绑定类型,根据业务提供所需的服务契约。但不禁想问,服务所使用的消息报文是什么样的形式么?蕴含什么样内容呢?WCF服务是否支持会话?WCF所提供的服务是单例的呢还是单调的呢?服务寄宿和客户端代理是如何实现的呢?接下来,将以这些问题为线索进行深入学习,包容包括XML序列化与SOAP消息、会话与实例、服务寄宿与客户端代理。

可以这么说,整个WCF服务都是构建在SOAP消息的基础上的,而SOAP消息是建立在XML这种跨平台的数据格式的基础上的,有人可能会说WCF也支持Restful风格的服务并支持json格式的数据,的确是这样,但这只是当时情况下的折中。现在可以发现,基本上以json格式为基础的restful服务其实都转化为了WebAPI项目,而不是WCF。所以仍然可以认为,WCF的初衷是为企业提供可靠的分布式SOA服务的,而WebAPI的出现,为WCF的不足之处进行了有利补充,用于提供公共的对外服务,更加的轻量级并与当下的互联网环境结合的更妥当。说了这么多,目的只有一个就是学习WCF一定要意识到学习SOAP相关知识的重要性,因为整个WS-*网络服务标准协议簇都建立在其之上,而与SOAP的基础XML相关的知识也就同样凸显出来了,其中最重要的就是XML的序列化,接下来通过图表进行简要的介绍。
| 知识点 | 诠释 |
| 消息格式化器MessageFormatter | WCF中消息的序列化和反序列化操作依赖该组件,服务器端(DispatchMessageFormatter)和客户端(ClientMessageFormatter),此外还可以通过实现IDispatch/ClientMessageFormatter接口自定义消息格式化器,例如压缩消息。 |
| 序列化器的选择 | 包括DataContractSerializer和XmlSerializer,后者存在多年,简单有效;前者是WCF专门构建的,可以用于复杂场景,是默认选择。 |
| 数据契约的等价性 | 在生产系统中,会出现修改接口的场景(例如添加删除接口方法数据成员,尽量避免),可能会对原有系统造成破坏,可以通过使用系统提供的扩展字段来避免这样的情况发生,附上一个可空的例子。 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.sory.com"> <xs:complexType name="Customer"> <xs:sequence> <xs:element name="Address" nillable="true" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema> |
| 数据契约和数据成员 | DataContractAttribute和DataMemberAttribute的本质是通过反射进行序列化为数据流,WCF支持集合数据和字典数据的数据契约 |
.此外,XML的文档结构描述方式,xsd文件和原来的DTD文件的相关知识也注意学习,可以参看http://utopialxw.iteye.com/blog/1218622。
接下来的消息部分,内容很多,但实际中比较重要的仅仅是WS-Addressing的相关属性和在消息头中添加安全信息。WS-Addressing的相关属性如下表所示。
| 属性名 | 诠释 |
| <To> | 以URI的形式表示消息发送的目标地址,如果没有显示指定,则采用默认地址http://www.w3.org/2005/08/addressing/anonymous |
| <From> | 以终结点引用的形式表示源终结点,不太常用 |
| <ReplyTo> | 以终结点引用的形式表示接受/回复消息的终结点,若未指定,则采用默认地址http://www.w3.org/2005/08/addressing/anonymous |
| <Action> * | 以URI的形式表示消息的意图,比如调用服务操作 |
| <MessageID> | 以URI的形式表示消息的唯一标识 |
| <RelatesTo> | 表示关联消息的<MessageID>,比如将恢复消息的<RelatesTo>属性设置为请求消息的<MessageID>,从而关联两者 |
| <ReferenceParameters> | 可以以任何XML元素提供额外的辅助信息 |
另一个为添加安全信息:messageProperty.Headers.Add(HttpRequestHeader.Cookie, "SecurityToken="+securityToken);
常见的,XML编码通常设计XmlDictionary,XmlDictionaryWriter和XmlDictionaryReader等几个类。

这部分的内容主要集中在对实例上下文的概念和单例、单调、会话三种模式的理解。在托管应用程序中,当创建一个托管对象时,CLR会在托管堆为该对象分配内存空间,对象的生命的终结对应内存的回收。负责该部分工作的模块为GC,其对没有被"根"引用的对象进行回收,对于WCF来说,其实例上下文即为其根,其层级关系为ServiceHost->InstanceContext->ServiceInstance。
实力上下文的模式包括PerCall单调、会话PerSession和Single三种。在单调模式时,系统的并发性最好,但对资源的消耗很大,比如数据库支持100个并发,这是有100个服务实例同时打开,那么第101请求就无法得到服务。而单例模式对资源的消耗较少,每次完成调用就释放资源,但是当请求多时,会有很多请求需要排队,响应不够及时。而会话模式,根据用户来创建服务示例,算是一种折衷。
Tip:高性能和可伸缩性是软件设计与架构中永远不可同时兼顾的,高性能需要充足的资源,高扩展性需要尽可能的节约资源,所以才有软件架构是意向"权衡"的艺术,目的不是使得各方面达到最优,而是找到一个平衡点使得整体最优,在实践中,没有完美的方案,只有适合方案,必须具体问题具体分析。

服务寄宿的内容比较简单,主要包括ServiceHost,iis寄宿和window寄宿的介绍。
ServiceHost:是服务寄宿的核心,包括创建、终结点添加、开启和关闭等基本步骤,服务描述的创建和运行时框架体系的构建也与其息息相关。
对于iis寄宿和windows寄宿来说,在当下的互联网环境下,iis寄宿显得更加合理,其优点包括:自动化的进程激活和关闭;自动化的进程回收;自动化的进程健康监测;ASP.NET共享寄宿模式,将多个应用寄宿在通过一个工作进程,改善服务器密度和可伸缩性;ASP.NET动态编译。通过.svc文件来标识服务,提供ASP.NET并行和兼容两种模式,默认使用第一种,第二种仅在需要共享SessionState时,不常用。
客户端代理的内容相对稍微多一点,其涉及透明代理和真实代理的概念,一个精简的WCF框架和服务限流操作的例子。
服务代理:作为服务在客户端的本地代理,本身不承担功能实现,仅仅是在服务与客户端之间起到一个中介的作用,是一种透明代理,可以通过RemotingServices.IsTransparentProxy方法来判断,其最终都通过ChannelFactory<TChannel>创建。在托管环境中,AppDomain提供了一种轻量级的隔离机制,不同AppDomain之间通过封送(Marshaling)来传递对象。封送分为按值封送和按引用封送两种形式,前者通过序列化/反序列化重建一个相同的本地对象,实现不同AppDomain的数据共享;后者将远程对象的引用传递给本地,实现跨应用程序与的远程调用(RPC)。那么如何实现RPC呢,简单来说,如果需要在A域(应用程序域)调用B域创建对象,那么B域需要为该对象创建其引用System.Runtime.Remoting.ObjRef对象,并将其按值封送带A域。A域基于它创建代理对象,之后再调用时,代理对象通过ObjRef将调用请求跨域发送给远程对象,最后将远程调用得到的结果返回给客户端程序。实际上,代理对象包含两种类型,一种是上面提到的透明代理,另一种为System.Runtime.Remoting.Proxies.RealProxy表示的真是代理。透明代理依托于真实代理,其将调用请求转发给真实代理,真实代理完成真正的远程调用,如下图所示。

精简的WCF框架
服务端的流程包括:请求消息的接受和回复信息的发送;请求消息的解码和回复消息的编码;请求消息的反序列化和回复消息的序列化;服务对象的创建;服务操作的执行。
客户端的流程包括:请求消息的序列化和回复消息的反序列化;请求消息的编码和回复消息的解码;请求消息的发送和回复消息的接收。整体过程如下图所示。

最后介绍一下服务限流(Throttling)机制,WCF具有一个MaxConcurrentSessions的阈值,表示服务端允许的最大并发会话数量,默认为100(针对一个CPU),一旦超过服务端就会拒绝之后的服务。而客户端的调用在限定时间内如果无法被及时处理,就会抛出一个TimeoutException异常。
参考资料:
[1]蒋金楠. WCF全面解析[M]. 上海:电子工业出版社, 2012.
快速入门系列--WCF--02消息、会话与服务寄宿的更多相关文章
- 快速入门系列--WebAPI--01基础
ASP.NET MVC和WebAPI已经是.NET Web部分的主流,刚开始时两个公用同一个管道,之后为了更加的轻量化(WebAPI是对WCF Restful的轻量化),WebAPI使用了新的管道,因 ...
- 快速入门系列--WebAPI--03框架你值得拥有
接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...
- [转]快速入门系列--WebAPI--01基础
本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...
- 快速入门系列--WebAPI--04在老版本MVC4下的调整
WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了.在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.N ...
- 快速入门系列--MVC--01概述
虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...
- 前端学习 node 快速入门 系列 —— 初步认识 node
其他章节请看: 前端学习 node 快速入门 系列 初步认识 node node 是什么 node(或者称node.js)是 javaScript(以下简称js) 运行时的一个环境.不是一门语言. 以 ...
- webpack 快速入门 系列 —— 性能
其他章节请看: webpack 快速入门 系列 性能 本篇主要介绍 webpack 中的一些常用性能,包括热模块替换.source map.oneOf.缓存.tree shaking.代码分割.懒加载 ...
- vue 快速入门 系列 —— vue-cli 下
其他章节请看: vue 快速入门 系列 Vue CLI 4.x 下 在 vue loader 一文中我们已经学会从零搭建一个简单的,用于单文件组件开发的脚手架:本篇,我们将全面学习 vue-cli 这 ...
- 快速入门系列--MVC--02路由
现在补上URL路由的学习,至于蒋老师自建的MVC小引擎和相关案例就放在论文提交后再实践咯.通过ASP.NET的路由系统,可以完成请求URL与物理文件的分离,其优点是:灵活性.可读性.SEO优化.接下来 ...
- 快速入门系列--MVC--07与HTML5移动开发的结合
现在移动互联网的盛行,跨平台并兼容不同设备的HTML5越来越盛行,很多公司都在将自己过去的非HTML5网站应用渐进式的转化为HTML5应用,使得一套代码可以兼容不同的物理终端设备和浏览器,极大的提高了 ...
随机推荐
- MIPS ABI n32意味着什么?
ABI是应用程序二进制接口的简称,用于标识处理器的工作模式及规范目标文件的编码格式. MIPS指令集架构自MIPS3起正式支持64位工作模式,故编码可以遵从o32(o意思是old).n32(n意思是n ...
- step by step 之餐饮管理系统六(数据库访问模块)
距上次写的博客已经好几个月,一方面公司里面有很多的东西要学,平时的时候又要写代码,所以没有及时更新,不过现在还好,已经成型了,现在把之前的东西贴出来,先看一下现在做的几个界面吧.第一个界面是用颜色用区 ...
- Windows Phone 8.1 新特性 - 控件之列表选择控件
本篇我们来介绍Windows Phone 8.1 新特性中的列表选择控件. 在Windows Phone 8 时代,大家都会使用 LongListSelector 来实现列表选择控件,对数据进行分组显 ...
- Software Testing hw1
I still remember the error which I made in my java project last year. I spent a whole night solving ...
- 编译系统中BNF: Backus-Naur Form
巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首次引入一种形式化符号来描述给定语言的语法. 简称为:BNF符号. 现在,几乎每 ...
- java-代理模式及动态代理
代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在考虑到性能或安全等因素的情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. ...
- java类集开发中一对多和多对多的关系的实现
摘自<java开发实战经典>李兴华.著 一对多的关系 一个学校可以包含多个学生,一个学生属于一个学校,那么这就是一个典型的一对多关系,此时就可以通过类集进行关系的表示. 在定义Studen ...
- hdu 5944 Fxx and string
\:nn,下标从1开始,第\:i\:i位的字母为\:s_isi,现在Fxx想知道有多少三元组\:(i,j,k)\:(i,j,k)满足下列条件 1.i,j,k\:i,j,k三个数成等比数列 2.s ...
- SSH框架的简单示例(执行流程)
本文转自一篇博文,感觉通俗易懂,适用于初学j2ee者,与大家一起分享 (一)struts框架部分 1.打开Myeclipse,创建一个web project,项目名称为TestSSH. 2.在web的 ...
- CSS浮动(float,clear)通俗讲解
首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.如下图: 可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1后边,因为d ...