首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

35.2  WCF概念

本节描述WCF的如下方面:

●       WCF通信协议

●       地址、端点和绑定

●       合同

●       消息模式

●       行为

●       主机

35.2.1  WCF通信协议

如前所述,可以通过许多传输协议与WCF服务通信。在.NET 3.5 Framework中定义了4个协议:

●       HTTP:它允许与任何地方的WCF服务通信,包括Internet。可以使用HTTP通信技术创建WCF Web服务。

●       TCP:如果正确配置了防火墙,它允许与本地网络或Internet上的WCF服务通信。TCP比HTTP高效,功能也比较多,但配置起来比较复杂。

●       指定的管道:它允许与WCF服务通信,该WCF服务必须与调用代码位于同一台机器的不同进程上。

●       MSMQ:这是一种排队技术,允许应用程序发送的消息通过队列路由到目的地。MSMQ是一种可靠的消息传输技术,可以确保发送给队列的消息一定达到该队列。MSMQ还是一种异步技术,所以只有排在前面的消息都处理完了,服务仍有效时,才能处理当前的消息。

这些协议常常允许建立安全连接。例如,可以使用HTTPS协议建立Internet上的安全SSL连接。TCP使用Windows安全架构为本地网络上的安全性能提供了更多的可能性。

图35-1中列出了这些传输协议如何把应用程序与不同位置上的WCF服务连接起来。本章将介绍所有这些协议,但MSMQ除外,这个主题需要较深入的讨论。

图  35-1

为了连接WCF服务,必须知道它在什么地方。这表示必须知道端点的地址。

35.2.2  地址、端点和绑定

用于服务的地址类型取决于所使用的协议。本章前面介绍的3个协议都需要格式化的服务地址:

●       HTTP:HTTP协议的地址是URL,其格式很常见:http://<server>:<port>/<service>。对于SSL连接,也可以使用https://<server>:<port>/<service>。如果在IIS中存储服务,<service>就是扩展名为.svc的文件(.svc文件类似于Web服务中使用的.asmx文件)。IIS地址可能包含比这个示例更多的子目录,即.svc文件之前有更多用/字符分隔的部分。

●       TCP:TCP的地址采用net.tcp:// <server>:<port>/<service>形式。

●       指定的管道:指定的管道连接的地址与上述类似,但没有端口号。其形式是net.pipe:// <server>/<service>。

服务的地址是一个基地址,它可用于为表示操作的端点创建地址。例如,在net.tcp:// <server>:<port>/<service>/operation1上有一个操作。

假定创建一个WCF服务,它有一个操作,绑定了前面介绍的3个协议,我们就可以使用下面的基地址:

http://www.mydomain.com/services/amazingservices/mygreatservice.svc

net.tcp://myhugeserver:8080/mygreatservice

net.pipe://localhost/mygreatservice

接着就可以给操作使用下面的地址:

http://www.mydomain.com/services/amazingservices/mygreatservice.svc/greatop

net.tcp://myhugeserver:8080/mygreatservice/greatop

net.pipe://localhost/mygreatservice/greatop

如前所述,绑定不仅指定了操作使用的传输协议,还可以指定在传输协议上通信的安全要求、端点的事务处理功能、消息编码等。

绑定提供了非常大的灵活性,所以.NET Framework提供了一些可用的预定义绑定。还可以把这些绑定用作起点,修改它们,得到需要的绑定类型。预定义绑定有一些必须遵循的原则。每种绑定类型都用System.ServiceModel名称空间中的一个类表示。表35-1中列出了这些绑定及其基本信息。

表  35-1

绑   定

说   明

BasicHttpBinding

最简单的HTTP绑定,Web服务使用的默认绑定,它的安全功能有限,不支持事务处理

WSHttpBinding

HTTP绑定的一种高级形式,可以使用WSE中引入的所有额外功能

WSDualHttpBinding

扩展了WSHttpBinding功能,包含双向通信功能。在双向通信中,服务器可以启动与客户机的通信,还可以进行一般的消息交换

WSFederationHttpBinding

扩展了WSHttpBinding功能,包含联合功能。联合功能允许第三方实现单向广播(single sign-on)和其他专用安全措施。这是一个高级主题,本章不讨论

NetTcpBinding

用于TCP通信,允许配置安全性、事务处理等

NetNamedPipeBinding

用于指定管道的通信,允许配置安全性、事务处理等

NetPeerTcpBinding

允许与多个客户机进行广播通信,是一个高级类,本章不讨论

NetMsmqBinding和

MsmqIntegrationBinding

这些绑定用于MSMQ,本章不讨论

这个表中的许多绑定类有可用于其他配置的类似属性。例如,它们都有可用于配置超时值的属性。本章后面介绍编码时会详细讨论。

35.2.3  合同

合同定义了WCF服务的用法。可以定义如下几种合同:

●       服务合同:包含服务的一般信息和服务提供的操作。例如,该合同可以包含服务使用的名称空间。在为SOAP消息定义模式时,服务使用唯一的名称空间,以避免与其他服务冲突。

●       操作合同:定义操作的用法,这包括操作方法的参数和返回类型,以及其他信息,例如,方法是否返回响应消息。

●       消息合同: 允许定制SOAP消息内部的信息格式化方式。例如,数据应包含在SOAP标题中还是SOAP消息体中。创建必须与以前的系统集成的WCF服务时,就可以使用消息合同。

●       错误合同:定义操作可能返回的错误。使用.NET客户程序时,错误会导致可以捕获的异常,并以通常方式处理。

●       数据合同:如果使用复杂的类型,如用户定义的结构和对象,作为操作的参数或返回类型,就必须为这些类型定义数据合同。数据合同根据通过属性显示的数据定义类型。

一般使用特性把合同添加到服务类和方法中,如本章后面所述。

35.2.4  消息模式

上一节提到,操作合同可以定义操作是否返回一个值,WSDualHttpBinding允许进行双向通信。这些都是消息模式,消息模式有3种类型:

●       请求/响应消息传输:交换消息的“一般”方式,每个发送给服务的消息都会从客户机中得到一个响应。这并不意味着客户机等待响应,因为可以用通常的方式异步调用操作。

●       单向消息传输:消息从客户机传输给WCF操作,但不发送响应。不需要响应时,就可以使用这种消息模式。例如,创建一个WCF操作,它会重启WCF主机服务器,此时不需要等待响应。

●       双向消息传输:一种比较高级的模式,客户机可以用作服务器,服务器也可以用作客户机。启动后,双向消息传输允许客户机和服务器彼此发送消息,这些消息可能有响应,也可能没有。这类似于创建一个对象,并订阅该对象提供的事件。

本章的后面将使用这些消息模式。

35.2.5  行为

行为是把没有直接提供给客户机的其他配置应用于服务和操作的方式。给服务添加行为,可以控制如何实例化行为、主机进程如何使用行为,行为如何参与事务处理,在服务中如何解决多线程问题等。操作行为可以控制在操作执行过程中是否使用模仿功能,各个操作行为如何影响事务处理等。

本章仅介绍WCF服务的基本知识,讨论行为的最基本功能。

35.2.6  主机

本章的引言曾提到,WCF服务可以存储在几个不同的进程中,包括:

●       Web服务器:基于IIS的WCF服务是WCF提供的最接近Web服务的服务。还可以使用WCF服务中的高级功能和安全特性,这些功能和特性很难在Web服务中实现。也可以集成IIS特性,如IIS安全特性。

●       可执行文件:可以把WCF服务存储在.NET中创建的任意应用程序类型中,如控制台应用程序、Windows窗体应用程序和WPF应用程序。

●       Windows服务: 可以把WCF服务存储在Windows服务中,这表示可以使用Windows服务提供的有用特性,包括自动启动和错误恢复。

●       Windows Activation Service(WAS):专门用于存储WCF服务,基本上是IIS的一个简化版本,可以在任何没有IIS的地方使用。

上述列表中的两个选项IIS和WAS为WCF服务提供了有用的特性,例如激活、处理循环和对象池。如果使用另外两个存储选项,WCF服务就是自存储的。这不一定是件坏事,因为我们可能不需要主机环境提供的其他功能。但是对于自存储的服务需要编写更多的代码。