深入了解 Windows Communication Foundation






4.44/5 (32投票s)
2007年1月30日
13分钟阅读

96661

1151
本文详细介绍了 WCF,并附有不同绑定类型的源代码。
摘要
在本文中,我将深入介绍 WCF(Windows Communication Foundation),这是 Microsoft 推出的最新技术和框架,旨在简化分布式应用程序的开发人员生活。
引言
为了简化开发人员的生活,Microsoft 不断推出新市场技术。有时这些技术与前身类似,有时它们会大幅增强现有技术。因此,我们可以看到 .NET 2.0 中网页的处理架构完全改变了。现在 .NET 2.0 在 Winform 应用程序开发中并没有带来显著增强。那么,我们如何才能开发一个可以在不同操作系统之间分布式,并在同一操作系统上使用时获得性能优势的 Windows 应用程序呢?答案就是 WCF,即 Windows Communication Foundation(WCF)代号 INDIGO。
在本文中,我们将学习 WCF 的基本组件,并深入了解这些组件的一些细节。我们将尝试解决以前版本中面临的问题,并找出为什么要使用 WCF。
什么是 WCF
如前所述,WCF 是基于 .NET 2.0 框架构建的 Windows Communication Foundation。它是一种服务执行框架,专门用于建立不同系统之间的通信,并在类似系统上获得性能优势。它整合了 Web 服务、远程处理、MSMQ、System.Messaging
和 Microsoft 企业服务的最佳功能。WCF 最大的优势之一是它支持大多数开放行业标准,因此它可以在异构操作系统上产生最佳结果。其他优点是它使用托管代码开发,并利用 .NET 2.0 的强大功能和特性。由于它支持 WS-* 标准,因此支持事务、安全性、可靠性。WCF 使用 SOAP 作为其本机通信协议。
先决条件
开发 WCF 服务需要以下条件
- 操作系统:Windows VISTA、Windows XP SP2、Windows 2003 Server SP1
- VS 2005 专业版,带 SP1
- Microsoft Windows 软件开发工具包
- .NET 3.0 运行时
- WCF 扩展(在使用 VS 2005 编辑器时)
WCF 的关键组件
WCF 基于以下用于构建 WCF 服务的关键组件。我们将在下面的部分中详细介绍每个组件
- 契约定义
- 数据契约和数据成员
- 服务契约
- 故障契约
- 消息契约
- 端点
- 绑定
BasicHttpBinding
WSHttpBinding
WSDualHttpBinding
WSFederationHttpBinding
MsmqIntegrationBinding
NetMsmqBinding
NetNamedPipeBinding
NetPeerTcpBinding
NetTcpBinding
- 托管环境
- Windows 应用程序
- 控制台应用程序
- Windows 服务
- IIS
- WAS (Windows 激活服务) 随 IIS 7.0 提供
- Windows Presentation Foundation
WCF 解决的问题
到目前为止,我们已经了解了什么是 WCF 以及 WCF 组件是什么。但是,除非我们了解 WCF 解决的问题,否则我们永远不会了解 WCF 的强大之处。
想象一下您正在为一家银行开发一个企业应用程序。当您开始设计系统时,需求非常复杂和关键。例如,该应用程序由银行员工、外部客户和一些支付网关系统使用。您不确定外部客户将使用什么操作系统和什么类型的客户端。您希望在内网中使用时获得性能、安全性和可靠性,并在从外部使用时获得安全性和可靠性。以前,您可以为外部客户端使用公开 Web 方法的 Web 服务,为 Windows 操作系统使用远程处理或 COM+ 应用程序。这两个应用程序都使用相同的业务逻辑和相同的数据库。假设您想添加一些新的业务逻辑,例如引入一个新的贷款系统,想象一下更改所有系统需要多长时间。这也许是最简单的例子。如果您要在 6 个月内修改业务逻辑或添加 3-4 个额外的方案怎么办?当前的设计将无法扩展。您会开始思考,如果我有一个单一的应用程序,为不同和相似的客户端公开多个端点,并且能给我带来行业范围内的开放标准的所有好处,那该怎么办?就是这样。WCF 就是您问题的答案。WCF 使用托管代码,利用 .NET 2.0 的强大功能和特性,通过支持所有开放行业标准,提供性能、安全性、事务、可靠性等所有优势,通过统一编程模型并结合所有可用技术的最佳功能,使开发人员和组织的生活变得轻松。
WCF 可与以下内容互操作
- Web 服务
- .NET - .NET 通信
- 分布式事务
- 支持 WS-* 规范
- 队列消息
WCF 的关键子系统
- 服务模型
- 连接器框架
- 托管环境
- 系统服务
- 消息服务
WCF 中的关键组件
- 合同
- 绑定
- 端点定义
- 托管环境
我们将在接下来的部分中详细介绍每个组件。
合同
契约是 WCF 最重要的组件之一。契约使开发可互操作的服务成为可能。它是客户端和服务器之间关于可用方法、数据结构和消息结构的共同理解。它们保持松耦合和平台独立。WCF 包含以下契约。由于 SOAP 是 WCF 通信的本机协议,因此接口、类由 CLR 转换为 SOAP 类型。
服务契约
- 转换为 WSDL。服务契约定义了服务可以执行的操作。这是 WCF 服务必须至少包含的一个。它也可以有多个服务契约。它使用
[ServiceContract]
属性定义。服务契约的实现者是托管代码。因此,服务契约还将接口和方法映射到平台无关的描述。使用 .NET 的属性功能,我们可以扩展服务的行为,例如它是否是单向或双向,异常处理行为等。 - 每个服务契约都包含公开给外部并使用
[OperationContract]
属性注释的方法。 - 服务契约还可以指定端点应满足的要求。
例如,端点应满足会话要求。 - 示例
[ServiceContract (ProtectionLevel=System.Net.Security.ProtectionLevel.None)] public interface IWCFService { [OperationContract] string GetSystemIPAddress(); [OperationContract] List
GetEmpolyeeArray(); [OperationContract] Employee CreateNewEmployee(); } - 通常我们也可以在类上使用服务契约。但这不是一个好习惯,因为接口允许与实现逻辑分离。在使用方法或类上的
ServiceContract
和OperationContract
时,访问修饰符没有任何意义。所有标记为ServiceContract
或OperationContract
的内容都将暴露给应用程序域之外的客户端。 - 服务分为三种类型
- 类型化:用于简单通信。它可以接受或返回简单或复杂的数据对象。
例如,上面类中的CreateNewEmployee()
方法 - 非类型化:它允许开发人员在消息级别工作。
例如,Message ParseRequest(Message myRequestMessage)
- 类型化消息:介于类型化和非类型化服务之间。
使用 Message 契约定义的自定义消息类。MyMessage ProcessedRequest(MyRequestMessage msg)
- 类型化:用于简单通信。它可以接受或返回简单或复杂的数据对象。
数据契约
- 转换为 XML 模式 (XSD)。主要描述数据结构。当我们想要传递或返回更多值时,我们选择数据契约。它是一个可序列化的对象,可以传递给服务或从服务返回。它支持版本控制,前提是您不更改现有成员的名称、命名空间的名称以保持兼容性。
- 数据契约可以通过在类、结构或枚举上注释
[DataContract]
属性来定义。要向外部公开的数据成员使用类和结构的[DataMember]
属性以及枚举的[EnumMember]
属性进行注释。 [DataContract]
告诉 WCF 如何序列化对象。WCF 根据客户端序列化成员。如果通信发生在 WCF 和 WCF 之间,则它使用 SOAP 上的二进制序列化来优化性能。而在 WCF 到非 Windows 客户端的情况下,它使用 SOAP 序列化。- 在这里访问修饰符也不起任何作用。
- 在某些情况下,您没有为给定服务生成代理。这可能是 WCF 服务仅使用 TCP 端点进行交互的情况。在这种情况下,WSDL 将不可用,除非在服务行为中显式定义了 HTTP 端点。即使客户端没有 WSDL,我们也可以在客户端创建相同的 WCF 虚拟类或代理类。WCF 服务将保持不变,实现者将从
ClientBase
派生并实现 WCF 服务 (IWCFService)。在这种情况下,操作契约方法将调用base.Channel.GetSystemIPAddress()
,并且它将由基础架构路由到服务器。在这种情况下,我们可以以相同的方式定义数据契约成员。唯一且最重要的是命名空间必须与服务器具有相同的名称。此外,方法名称和数据成员名称应保持不变。
故障契约
- 转换为 SOAP 故障。允许开发人员记录服务可能产生的错误。我们只能通过使用
[FaultContract(typeof(System.Exception))]
属性进行注释来在[OperationContract]
上定义服务契约。此处,异常类型可以是您要记录的异常。自定义异常应标记为可序列化。
消息契约
- 转换为 SOAP 消息。它描述了消息的结构,例如哪里放什么。WCF 允许开发人员控制消息中哪里放什么,以解决互操作性问题。消息契约允许您匹配其他系统对 SOAP 消息的期望。消息契约可以使用
[MessageContract]
属性定义。参与 SOAP 消息的成员可以使用[MessageHeader]
和[MessageBodyMember]
属性定义并放置在适当的位置。 - 示例
[MessageContract] public class MyMessage { [MessageHeader] public string myHeader; [MessageBodyMember] public Employee myMessageBody; }
绑定
绑定是 WCF 服务和客户端之间的通信通道。它们决定 WCF 服务如何与客户端通信。根据不同的协议,如 HTTP、TCP、MSMQ,有不同类型的绑定。绑定支持使用文本编码、二进制编码和消息传输优化机制(MTOM,用于有效传输大于 64K 的大型附件的可互操作消息格式)对消息进行编码。由于 WCF 支持所有行业开放标准,因此它通过 SSL 和 WS-Security(定义的安全模式)标准支持安全性。如果我们想要
启用了会话的服务,则绑定决定服务是否启用了会话。并非所有绑定都支持会话。由于 WCF 是可扩展的,因此我们可以定义自己的自定义绑定。但这非常罕见,因为 WCF 有九种内置绑定,足以满足大多数应用程序的需求。例外情况可能是:站点的 RSS feed 或 SMTP 协议。
1 | BasicHttpBinding |
: | 默认情况下,不带安全性的基本 Web 服务通信 |
2 | WSHttpBinding |
: | 支持 WS-* 标准的 Web 服务,支持事务 |
3 | WSDualHttpBinding |
: | 支持双工契约和事务的 Web 服务 |
4 | WSFederationHttpBinding |
: | 支持联合安全和事务的 Web 服务 |
5 | MsmqIntegrationBinding |
: | 与 MSMQ 直接通信,支持事务 |
6 | NetMsmqBinding |
: | 使用队列和事务支持的 WCF 应用程序之间的通信 |
7 | NetNamedPipeBinding |
: | 同一计算机上 WCF 应用程序之间的通信,支持双工契约和事务 |
8 | NetPeerTcpBinding |
: | 跨对等服务计算机之间的通信,支持双工契约 |
9 | NetTcpBinding |
: | WCF 应用程序之间跨计算机通信,支持双工契约和事务 |
这是基地址方案到传输协议的映射
http | : | HTTP |
net.tcp | : | TCP |
net.pipes | : | 命名管道 |
net.msmq | : | MSMQ |
端点
端点不过是暴露给外部世界并供客户端连接到 WCF 服务的 URI。
每个端点都包含
- 基地址:消息发送到哪里 (A)
- 绑定类型:如何发送消息 (B)
- 契约:消息中发送什么 (C)
我们可以根据应用程序需要定义任意数量的端点。例如,如果应用程序要由 JAVA 客户端和 WPF 客户端使用,那么我们可以公开一个使用 TCP 绑定的端点,WPF 客户端将通过它进行通信,以及一个使用基本 HTTP 绑定的端点,JAVA 客户端将通过它进行通信。我们可以通过编程方式和使用应用程序配置文件来控制和配置端点的行为。
托管环境
WCF 应用程序的架构通常如下所示
数据库层 => 业务逻辑层 => WCF 服务 => 托管环境
如上图所示,我们需要一个宿主来运行 WCF 服务。幸运的是,有许多选项可以用于宿主 WCF 服务。这实际上取决于应用程序要求。以下是宿主列表
- Windows 应用程序:简单的 Winform 应用程序
- 控制台应用程序:简单的控制台应用程序
- Windows 服务:WCF 服务可以由服务控制管理器控制
- IIS:可以宿主在 IIS 中,前提是服务至少公开一个 HTTP 端点
- WAS (Windows 激活服务) 随 IIS 7.0 提供:消除了对 HTTP 的依赖
- Windows Presentation Foundation
WCF 中的安全性
当您开发分布式应用程序时,最重要的方面是安全性。如前所述,WCF 通过绑定支持安全性。绑定通过 SSL、WS-Security 标准支持安全性。您还可以使用 Windows 身份验证。WCF 开发的主要目标之一是使其易于开发安全应用程序。WCF 服务可以通过四种方式进行保护
- 身份验证
- 消息完整性
- 消息机密性
- Authorization
关于使用安全机制有一些指导方针。根据应用程序的需求和要求,我们可以轻松选择合适的机制,并以少量工作实现。以下是指导方针
- 使用直接支持安全性的标准绑定。例如,需要通过多个 SOAP 中介进行端到端消息安全的应用程序可以使用支持 WS-Security 的绑定,例如
WsHttpBinding
。
使用可选支持安全性的标准绑定,然后根据需要进行配置。例如,只需要基于传输安全的应用程序可以选择BasicHttpBinding
,将其配置为使用 HTTPS 而不是 HTTP。还可以自定义其他更高级的安全行为。例如,如果需要,可以更改WsHttpBinding
等绑定使用的身份验证机制。 - 创建提供开发人员所需的确切安全行为的自定义绑定。这样做并非易事,但对于某些高级场景来说,它可能是正确的解决方案。
- 使用不支持安全性的标准绑定,例如
BasicHttpBinding
。虽然不使用安全性是一种冒险的行为,但在某些情况下它可能是唯一的选择。 - 其他重要功能
WCF 中还有许多其他功能可以用于实现可靠通信。它们如下
事务:WCF 使用 System.Transactions
来控制分布式应用程序中的事务。
- 服务行为还可以使用
[ServiceBehavior]
属性中的参数来控制事务。如果操作非常关键,操作契约可以使用[OperationBehavior]
属性强制执行事务。如果客户端也支持 WS-AutomicTransaction
,那么 JAVA 客户端和 WCF 服务可以共享同一个事务。一些绑定,如WsHttpBinding
和NetTcpBinding
,也允许配置事务流。例如:
队列:使用NetMsmqBinding
或MsmqIntegrationBinding
,WCF 支持消息队列。[OperationContract] [OperationBehavior(TransactionScopeRequired=true, TransactionAutoComplete=true)] public void TransferMoney(Account creditor, Account debitor) { // }
- 队列:使用
NetMsmqBinding
或MsmqIntegrationBinding
,WCF 支持消息队列。 - 可扩展性:WCF 允许根据应用程序要求创建自定义通道和绑定。例如,您可以创建用于与 SMTP 协议或 RSS 协议通信的通道。
应用程序概述
随附的应用程序解决方案包含六个项目
- 控制台客户端:它在不创建代理的情况下调用 WCF 服务。契约和数据成员在客户端手动创建。它使用简单的 TCP 绑定。
MsmqClient
:顾名思义,它使用 MSMQ 绑定。在运行此应用程序之前,必须安装 MSMQ 并创建具有给定名称的私有队列。SystemInfo
:简单的数据访问类。它没有做任何特别的事情。WCF 服务调用此类的方法。WCFClient
:简单的 Windows 应用程序,用于演示使用 svcutil 创建的 WSDL 的工作方式。使用Basichttp
绑定。WCFHost
:一个简单的控制台应用程序,充当 WCF 服务的宿主。WCFservice
:实际的 WCF 服务,包含服务契约和数据契约。还包含 .SVC 文件,以便可以直接在 IIS 中进行宿主。它还包含 MSMQ 绑定所需的其他详细信息。有一个实现服务契约的实现者类。大部分代码都是自解释的。您的建议始终受到欢迎。
结论
我们可以得出结论,WCF 简化了 Windows 上分布式应用程序的创建。因为它实现了 SOAP 和最重要的 WS-* 规范,WCF 提供了与其他 Web 服务平台的全面互操作性。而且因为它明确支持面向服务的方法,WCF 为开发人员构建现代软件提供了一个自然的环境。