WCF的学习之旅
一、WCF的简单介绍
Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是MS为SOA (Service Oriented Architecture)战略而设计的一套完整的技术框架。它是一种统一的编程模型,用来为微软平台编写分布式(Distributed)应用。涵盖了之前出现的多种技术,如ASMX,Remoting,MSMQ等等。
优点:
1.整合了多项技术,是MS SOA产品的集大成者。
2.更为简单易用。(它囊括了关于服务的一切,无论是服务的创建,托管,消费和安全保障,还是保护与互通,甚至是提高开发效率)
3.包含了 其他技术的所有优点(统一性,互操作性,可靠性,兼容性)
二、客户端与服务的基本关系
1、客户端与服务
服务是一组向客户端提供可用功能的端点(Endpoints)。而端点(终结点)则是网络上的一个能将消息送达的资源。
客户端按照与服务之间的契约(Contract)来格式化消息,并将消息发送给端点来访问端点的功能。服务在端点指定的地址(Address)上监听具有特定格式的送达消息。
2、 服务的三要素(ABC)
A:Address 意味着在哪里(也含有传输方式信息)
B:Binding 意味着怎么做(与地址的传输方式要匹配)
C:Contract意味着做什么(服务契约)
3、WCF中的地址
4、元数据交换
WCF有两种方式可以发布自己的元数据:
1.基于HTTP-GET协议提供元数据
2.使用MEX终结点
5、WCF体系架构
三、WCF契约
a).服务契约(SerciceContract)
公布服务的功能。操作契约( OperationContract )则负责在方法级别公开。
b).数据契约(DataContract)
对传递的类对象进行XSD(XML Schema Definitions)定义,以便对其成员进行序列化。
c).消息契约(MessageContract)
自定义消息格式,包括消息头,消息体,还能指示是否对消息内容进行加密和签名。
d).错误契约(FaultContract)
自定义错误异常的处理方式。
四、绑定
就是预先配置好的信道栈,它代表了客户端和服务器之间线路级别上的约定。每个绑定都会指定通信所用的传输、编码及协议。
通过绑定,WCF封装了各种不同通信场所下所使用的配置。
绑定的组成:Name,Namespace,BindingElement
BindElement:
a)消息编码绑定元素(Message Encoding Binding Element)
b)传输绑定元素(Transport Binding Element)
c)协议绑定元素(Protocal Element):
主要是包含设置事务流控制,安全,会话,排序,升级/帮助器等信息
五、信道与信道栈
信道:就是WCF应用程序之间传送消息的通道,它负责以一种一致的方式对消息进行整理和传送。信道被用于传输层,协议层及消息解惑。
信道栈:所有各层次的信道一起,组成了信道栈。信道栈就是一个层次的通信栈,专门用于处理消息。
主要包括:传输信道、协议信道
信道模型
a)请求响应模式(Request/Reply)
客户端发送请求后,必须等待回应。
1)同步—请求响应模式
2)异步—请求响应模式
b)单向通信模型(Oneway)
客户端发送请求后,无需等待服务器回复,只需得到一个通知来确认消息已经成功发送即可
c)双工通信(Duplex)
通信双方都是客户端和服务器,双方都可以发送请求并回复消息。
六、行为的分类
a)服务行为
运行于服务级别,能访问所有的端点。主要控制实例化与事务,还用于授权和审计。
b)端点行为
涉及服务端点,适用于对进出服务的消息进行审查和处理。(消息跟踪器)
c)操作行为
涉及操作级别,对于服务操作而说,他们适用于序列化、事务流和参数处理。(参数检验器)
七、并发与实例化
WCF中控制并发的行为
1.实例上下文模式(InstanceContextMode)
a)Single:一个服务类的实例处理所有入站请求,这实现为单例(Singleton).
b)PerCall:为每个入站请求创建一个服务类的实例。
c)PerSession:为每个客户端会话创建一个服务类的实例。(默认方式)
2.并发模式(ConcurrencyMode)
a)Single:在同一时刻只有一个线程访问服务类,这是最安全的设置,因为不用担心线程安全问题。
b)Reentrant:在同一时刻只有一个线程访问类,但该线程能暂时离开服务类,稍后回来并继续访问。
c)Multiple:多个线程能并发访问服务类
八、托管
服务并不能单独存在,必须寄存在宿主中。服务宿主(Service host)是一个负责WCF服务的生命周期(LiftTime)和上下文(Context)的操作系统进程。
负责启动和停止WCF服务,并提供了一些控制服务的基本管理功能。
托管的方式:
1.控制台程序/WINDOWS程序(自托管)
优点:开发简单
缺点:在项目中应用并不常见,通常只用在测试阶段
2.IIS
优点:宿主进程可以在客户端提交第一次请求的时候自动启动,还可以借助IIS管理宿主进程的生命周期。
缺点:只能支持HTTP协议。
basicHttpBinding
wsHttpBinding
wsDualHttpBinding
3.Windows服务(自托管)
优点:随系统一同启动
4、IIS托管浏览元数据效果图
九、客户端
客户端引用服务的方法:
1.使用svcutil.exe工具(生成ServiceBase)
2.使用 Add Service Reference(控制台程序中没有) (生成ServiceBase)
3.使用信道工厂channelFactory或channelFactory<T>
4. 手工建立(手工添加继承ServiceBase)
客户端需要哪些文件:
1.契约接口
2.配置文件(非必须,可编码实现同样功能)
3.数据契约实现的类与系统支持的数据类型
十、服务建立
步骤一:构建整个解决方案
46.jpg)
Contracts:类库项目,定义服务契约(Service Contract),引用System.ServiceMode程序集(WCF框架的绝大部分实现和API定义在该程序集中);
Services:类库项目,对WCF服务的实现。定义在该项目中的所有WCF服务实现了定义在Contracts中相应的服务契约,所以Services具有对Contracts项目的引用
Hosting:控制台应用,实现对定义在Services项目中的服务的寄宿,该项目须要同时引用Contracts和Services两个项目和System.ServiceMode程序集;
Client:一个控制台应用模拟服务的客户端,该项目引用System.ServiceMode程序集。
步骤二:创建服务契约
注意:需要引用System.ServiceModel.dll
添加[ServiceContract]与[OperationContract]特性
步骤三:创建服务
注意:需要引用System.ServiceModel.dll
引用服务契约所在的dll


步骤四:通过自我寄宿的方式寄宿服务
注意:需要引用System.ServiceModel.dll
引用服务契约所在的dll
引用服务所在的dll
新建项,选择应用程序配置文件,文件名App.config保持不变。
修改app.config内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Services.CalculatorService" behaviorConfiguration="behaviorConfiguration">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8013/"/>
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="Contracts.ICalculator"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="behaviorConfiguration">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
步骤五:创建客户端调用服务
使用微软的svcutil工具CalculatorService服务的客户端代理类,
通过开始菜单/Microsoft Visual Studio 2010/Visual Studio Tools/Visual Studio 2010命令提示,启动命令环境。
确认CalculatorService服务已启动
切换当前路径到解决方案目录:cd G:\Program\WCF\WCFDeom\Client
输入命令:svcutil http://localhost:8013/?wsdl /o:CalculatorService.cs
执行成功后,会在解决方案目录下生成两个文件:CalculatorService.cs 和output.config
中止Host项目的调试,回到Client项目,选择添加 现有项 ,然后选择这两个文件,添加后,将output.config重命名为App.config
Client项目中添加引用,选择System.ServiceModel
修改program.cs代码如下:
步骤六:建立客户端程序
注意:需要引用System.ServiceModel.dll
引用服务契约所在的dll
(这里建立的方式是:信道工厂)
运行结果如下:
希望能够帮到各位园友们!精彩内容整理中..............
成功路上最心酸的是要耐得住寂寞、熬得住孤独,总有那么一段路是你一个人在走,一个人坚强和勇敢。
人的一生没有过不去的坎,跨坎的源动力在自已。
WCF的学习之旅的更多相关文章
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- WCF学习之旅—第三个示例之二(二十八)
上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1) 使用NuGet下载最新版的Entity Fram ...
- WCF学习之旅—第三个示例之三(二十九)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...
- WCF学习之旅—WCF服务部署到IIS7.5(九)
上接 WCF学习之旅—WCF寄宿前的准备(八) 四.WCF服务部署到IIS7.5 我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以 ...
- WCF学习之旅—WCF服务部署到应用程序(十)
上接 WCF学习之旅—WCF寄宿前的准备(八) WCF学习之旅—WCF服务部署到IIS7.5(九) 五.控制台应用程序宿主 (1) 在解决方案下新建控制台输出项目 ConsoleHosting.如下 ...
- WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...
- WCF学习之旅—WCF服务的WAS寄宿(十二)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...
- WCF学习之旅—WCF服务的批量寄宿(十三)
上接 WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...
- WCF学习之旅—第三个示例之五(三十一)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) WCF学习 ...
随机推荐
- C# WPF 粘贴板记录器
工作学习中需要搜索很多资料,有建立文档对遇到过的问题进行记录,但是一来麻烦,二来有些当时认为不重要的事情,也许一段时间后认为是重要的,需要记录的,却又一时找不到,浪费时间做重复的事情.正好借着这个机会 ...
- laravel中使用PHPQuery实现网页采集
由于没有PHPQuery的composer包安装所以需要我们手动在我们的laravel项目中安装加载PHPQuery,这里需要设置laravel的autoload->class map. 1.首 ...
- Linux 文本编辑常用快捷键
一.编辑模式 vim有三种编辑模式 1. i 进入文本编辑模式 2. esc 进入命令编辑模式 命令编辑状态下 dd删除整行 3. :进入底行模式 底行模式状态 输入q 退出 w保存 wq 保存并 ...
- HTTP认证之基本认证——Basic(二)
导航 HTTP认证之基本认证--Basic(一) HTTP认证之基本认证--Basic(二) HTTP认证之摘要认证--Digest(一) HTTP认证之摘要认证--Digest(二) 在HTTP认证 ...
- Hive学习笔记(四)-- hive的桶表
桶表抽样查询 查看hdfs上对应的文件内容 一个两个桶,第一个桶和第三个桶的数据 task = 4 4 / 2 = 2,一共是两个桶 第1个桶,第1+2个桶
- powerdesigner约束名唯一出错的解决办法
powerdesigner中自动生成的约束名有时会因为表的前缀一样而不具有唯一性,这样在生成时就会出错,一般的解决办法有以下两种: 1.模型=>Reference中可以看到当前模型中的所有Ref ...
- Oracle 了解 DDL 操作与 REDO 的关系
目录 了解 DDL 操作与 REDO 的关系 DDL是否会产生REDO 通过 10046 trace 来分析create 和drop 如果drop失败,redo的变化 了解 DDL 操作与 REDO ...
- 带有命名空间的xml解析,C#
前一段时间做花旗的接口,返回的xml格式是带有命名空间的,可是难倒了我,找了好久才找到解决办法,给大家分享下,少走弯路. 1,直接进入正题,先看一段带有命名空间的xml,这段xml大概的意思是,前面是 ...
- day05_02 IDE介绍及设置
notepad++比较麻烦,使用IDE工具进行程序开发 集成开发环境(IDE,Integrated Development Environment) VIM #经典的linux下的文本编辑器 Emac ...
- 序列化 pickle & json & shelve
把内存数据转成字符,叫序列化,dump,dumps 把字符转成内存数据类型,叫反序列化load,loads dumps:仅转成字符串 dump不仅能把对象转换成str,还能直接存到文件内 json.d ...