首页 > 技术文章 > WCF(一):初探WCF

xmyjcs 2018-01-20 17:30 原文

目录:

一、什么是WCF

二、WCF能做什么

三、WCF的模型

四、WCF的基本概念

五、WCF的快速创建

 

1.WCF是什么?

A、WindowsCommunication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台。

B、它是.NET框架的一部分,由.NET Framework 3.0开始引入,与WPF(界面图形框架)及WF(工作流框架)并称为新一代Windows操作系统以及WinFX(Windows Vista 的托管代码编程模型)的三个重大应用程序开发类库。

C、在.NETFramework 2.0以及前版本中,微软发展了WebService、.NET Remoting、Winsock等通信支持,由于各个通信方法的设计方法不同,而且彼此之间也有相互的重叠性,对于开发人员来说,不同的选择会有不同的程序设计模型,而且必须要重新学习,让开发人员在用户有许多不便。同时,服务导向架构SOA也开始盛行于软件工业中,因此微软重新查看了这些通信方法,并设计了一个统一的程序开发模型,对于数据通信提供了最基本最有弹性的支持,这就是WCF,所以WCF整合了原有的windows通讯的 .net Remoting,WebService,Socket的机制,并融合有HTTPFTP的相关技术。

 

2.WCF能做什么?

根据微软官方的解释,WCF(之前的版本名为“Indigo”)是使用托管代码建立和运行面向服务(Service Oriented)应用程序的统一框架。

它使得开发者能够建立一个跨平台的安全、可信赖、事务性的解决方案,且能与已有系统兼容协作。

WCF是微软分布式应用程序开发的集大成者,它整合了.Net平台下所有的和分布式系统有关的技术,如Enterprise Sevices(COM+).Net Remoting、Web Service(ASMX)、WSE3.0和MSMQ消息队列。

以通信(Communiation)范围而论,它可以跨进程、跨机器、跨子网、企业网乃至于 Internet;

以宿主程序而论,可以以ASP.NET,EXE,WPF,Windows Forms,NT Service,COM+作为宿主(Host)。

WCF可以支持的协议包括TCP,HTTP,跨进程以及自定义,安全模式则包括SAML, Kerberos,X509,用户/密码,自定义等多种标准与模式。也就是说,在WCF框架下,开发基于SOA的分布式系统变得容易了,微软将所有与此相关的技术要素都包含在内,掌握了WCF,就相当于掌握了叩开SOA大门的钥匙。

 

3.WCF模型:

         WCF体系架构如下:

      WCF的客户端与服务端模型如下:

     

 

4.WCF的基本概念:

1)地址 

WCF的每一个服务都有唯一的地址。地址包括服务位置和传输协议(传输样式)。服务位置包括目标机器名、站点、网络、端口、管道或队列,以及一个可选的特定路径或者URI。

地址常用格式为:[基地址]/[可选的URI],如“net.tcp://localhost:8081/MyService”。

基地址常用格式为:[传输协议]://[机器名或域名][:可选端口],如“net.tcp://localhost:8081”。

WCF支持多种传输样式:

  • HTTP 采用http、https协议进行传输,默认端口号80。
  • TCP 采用net.tcp协议进行传输,默认地址为808。
  • Peer network(对等网) 采用net.p2p进行传输,采用Windows的对等网传输机制。
  • IPC(内部进程通信) 采用net.pipe进行传输,使用Windows的命名管道机制,只能接收来自同一台机器的调用,且每台机器只能打开一个命名管道。
  • MSMQ 采用net.msmq进行传输,使用Windows的MSMQ机制,必须指定队列名,如果是处理私有队列,则必须指定队列类型。

2)绑定

绑定将通信模式与交互方式直接的组合进行规范,将这些通信特征合理地组合在一起。一个绑定封装了诸如传输协议、消息编码、可靠性、安全性、事务传播以及互操作性等相关选项的组合,使得它们保持一致。

WCF定义了六种常用的绑定:

  • 基本绑定 由BasicHttpBinding类提供,将WCF服务公开为Web服务。
  • TCP绑定 由NetTcpBinding类提供,使用TCP协议通信,支持多种特性,包括可靠性、事务性、安全性及WCF之间通信的优化,缺点是客户端必须使用WCF。
  • IPC绑定 由NetNamedPipeBinding类提供,使用命名管道为同一机器的通信进行传输,支持的特性与TCP绑定类似,是性能和安全性最佳的绑定。
  • Web服务绑定 由WSHttpBinding类提供,WS绑定使用HTTP或HTTPS进行传输,提供了诸如可靠性、事务性与安全性在内的多种特性,这些特性遵循WS-*标准,该绑定被设计用来与支持WS-*标准的系统进行互操作。
  • WS双向绑定 由WSDualHttpBinding类提供,支持双向通信。
  • MSMQ绑定 由NetMsmqBinding类提供,使用MSMQ进行传输。

      常用绑定的传输协议与编码格式如下:

   

注意:TCP、IPC和MSMQ绑定使用的二进制编码器是WCF专有的,不要试图为其编写针对其他平台的自定义解析器。

3)契约 

WCF的所有服务都公开为契约,契约与平台无关,是描述服务功能的标准方式。WCF包含4类契约:

  • 服务契约(Service Contract): 描述了客户端能够执行的服务操作。
  • 数据契约(Data Contract)定义了与服务交互的数据类型。
  • 错误契约(Fault Contract):定义了服务抛出的错误,以及服务处理错误和传递错误到客户端的方式。
  • 消息契约(Message Contract)消息契约允许服务直接与消息交互,用于定制专有的消息格式,也意味着要自己的应用程序上下文,因为会增加代码的复杂度,所以不属于常见用

 

4)终结点

终结点是WCF进行通信的唯一手段,ChannelFactory<T>本质上是通过制定的终结点创建用于进行服务调用的服务代理。

终结点在WCF体系中通过System.ServiceModel.Description.ServiceEndpoint类型表示,其包含三个核心属性——地址、绑定、契约。

终结点是用来发送和接收消息的构造,终结点是真正意义上的接口,它包含了一个对象接口所需的全部信息。

每个服务至少必须公开一个业务终结点,每个终结点有且只能拥有一个契约。

服务上的所有终结点都包含了唯一的地址,而一个单独的服务则可以公开多个终结点。这些结点可以使用相同或不同的绑定,公开相同或不同的契约。

 

5)元数据

服务的元数据描述服务的特征,外部实体需要了解这些特征以便与该服务进行通信。

服务的元数据包括XML、架构文档(用于定义服务的数据协定)和WSDL文档(用于描述服务的方法)。

启用元数据后,WCF通过检查服务及其终结点自动生成服务的元数据。

 

6)上下文

WCF上下文将服务宿主与公开本地CLR类型为服务的上下文组合在一起,上下文是服务实例最核心的执行范围,上下文可以为空,即不包含任何服务实例。

 

7)宿主

WCF服务类不能凭空存在,每个WCF服务类必须托管在某个宿主进程中。

单个宿主进程可以托管多个服务,而相同的服务类型也可以托管在多个宿主进程中,如果服务与客户端驻留在相同的进程中,则称为进程内托管。常用宿主如下:

  • Web站点
  • Windows窗体应用程序
  • Windows服务
  • Windows激活服务(WAS)

      WCF宿主体系结构如下:

 

每个.NET宿主进程都包含了多个应用程序域,每个应用程序域包含零到多个宿主实例,每个服务宿主实例专门对于于一个特殊的服务类型。

因此,创建一个宿主实例,实际上就是为对应于基地址的宿主机器的类型注册一个包含了所有终结点的服务宿主实例。每个服务宿主实例拥有零到多个上下文。一个上下文可以与零个或一个服务实例关联。

 

8 代理 

WCF不允许客户端直接与服务交互,客户端使用代理将调用转发给服务。即使对象是本地的,WCF仍然使用远程编程模型的实例化方式,并且使用代理。

 

5.WCF的快速创建及调用:

 第一步:通过VS创建一个WCF服务应用程序:解决方案-名称-位置自定义

 

 

第二步:点击确认后,会自动生成三个文件:服务契约接口,服务接口实现类,配置文件

 

 

第三步:对服务进行寄宿,点击Service1.svc在浏览器中进行查看,既可以寄宿该服务

 

 

第四步:服务寄宿后,我们就可以查看其元数据的信息以及调用服务产生客户端代理类

点击链接就可以看到服务的元数据信息如下:

 

第五步:我们通过svcutil.exe工具生成客户端代理类和客户端的配置文件

svcutil.exe是一个命令行工具,位于路径C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin下,我们可以通过命令行运行该工具生成客户端代理类

1.在运行中输入cmd打开命令行,输入 cd C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin

2.输入svcutil.exe /out:f:\TestProxy.cs /config:f:\App.config http://localhost:10998/Service1.svc?wsdl(注意:端口号改成本机服务寄宿的端口号)

此时在F盘,即生成两个文件:

 

第六步:创建一个控制台应用程序的客户端(Client),将生成的代理文件拷贝到该工程中,App.config直接替换

注:第五步也可以省略,直接在VS中"添加服务引用",靠VS自动生成客户端代理类和配置文件。

(1)代理类:

(2)配置文件:

此时你会看到客户端代理类中出现错误,原因是我们并未对服务需要的程序集进行引用。我们引用System.Runtime.Serialization和System.ServiceModel

 

 

第七步:在Main()方法中进行服务的方法调用:

 

第八步:设置客户端(Client)为启动项

 

Ctrl+F5 运行效果如下:

 

 

推荐阅读