一、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中的地址   

         •Http(basic,WS*)
         •Tcp  
         •Peer netWork(对等网)
         •IPC(基于命名管道的内部进程通信)
         •MSMQ

          

    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.数据契约实现的类与系统支持的数据类型

  十、服务建立

 步骤一:构建整个解决方案

 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的学习之旅的更多相关文章

  1. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  2. WCF学习之旅—第三个示例之二(二十八)

    上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1)  使用NuGet下载最新版的Entity Fram ...

  3. WCF学习之旅—第三个示例之三(二十九)

    上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...

  4. WCF学习之旅—WCF服务部署到IIS7.5(九)

    上接   WCF学习之旅—WCF寄宿前的准备(八) 四.WCF服务部署到IIS7.5 我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以 ...

  5. WCF学习之旅—WCF服务部署到应用程序(十)

    上接  WCF学习之旅—WCF寄宿前的准备(八) WCF学习之旅—WCF服务部署到IIS7.5(九) 五.控制台应用程序宿主 (1) 在解决方案下新建控制台输出项目 ConsoleHosting.如下 ...

  6. WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) 七 WCF服务的Windows 服务程序寄宿 这种方式的服务寄宿,和IIS一样有一个一样 ...

  7. WCF学习之旅—WCF服务的WAS寄宿(十二)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...

  8. WCF学习之旅—WCF服务的批量寄宿(十三)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...

  9. WCF学习之旅—第三个示例之五(三十一)

       上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九) WCF学习 ...

随机推荐

  1. C语言中的32个关键字

    C语言中的32个关键字 数据类型关键字(12个) (1)     char:声明字符型变量或函数 (2)     double:声明双精度变量或函数 (3)     enum:声明美剧类型 (4)   ...

  2. 【java】 java 内存解读

    具体请参考 vamei java 内存管理和垃圾回收 java的内存分为栈内存和堆内存两部分 栈内存 主要存储一些参数,局部变量和返回地址,参数和局部变量大部分是基本类型的变量,如果是引用类型,实际上 ...

  3. The 2018 ACM-ICPC Chinese Collegiate Programming Contest Fight Against Monsters

    #include <iostream> #include <cstdio> #include <cstring> #include <string> # ...

  4. cs229课程索引

    重要说明 这个系列是以cs229为参考,梳理下来的有关机器学习传统算法的一些东西.所以说cs229的有些内容我会暂时先去掉放在别的部分里面,也会加上很多重要的,但是cs229没有讲到的东西.而且本系列 ...

  5. Java装饰者模式(Decorator)

    一.定义 装饰模式的设计理念主要是以对客户端透明的方式动态扩展对象的功能,是继承关系的一个替代(继承会产生大量的子类,而且代码有冗余).装饰模式可以在不创造更多子类的情况下,将对象的功能加以扩展.装饰 ...

  6. 基于TCP协议的网络通讯流程

    不多说了,先上个图: 从上面的图中可以看出来,基于TCP协议进行通讯可以大致分成以下几个阶段: 1. 首先是在服务器端, TCP Sever调用socket(), bind(), listen()完成 ...

  7. luogu3371 【模板】单源最短路径 dijkstra堆优化

    #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> ...

  8. Leetcode2--->链表中对应位相加(进位)

    题目: 给定两个单链表,单链表中的数都是非负数.链表中的数字都是反向存储的,,每个节点都是个位数,将链表对应的位相加,返回最终的结果: 举例: Input: (2 -> 4 -> 3) + ...

  9. Timus 1329. Galactic History。LCA最近公共祖先或dfs递归离线处理!

    1329. Galactic History 比赛的时候看到学弟A了这题然后跟榜做,结果在LCA的道路上一去不复返,这个题是很像LCA求最近公共祖先的,不过三个人都没学过LCA,只能拿着资料看着像然后 ...

  10. DS博客作业-05--树

    1.本周学习总结  1.1思维导图  1.2学习体会 1.课堂上的知识也很难听懂,打代码就更难听懂了,真的需要不断练习代码. 2.在学习本章的内容中,一开始只是理解了概念,在真正做题中,一点思路都没有 ...