面向服务架构和 WCF






4.73/5 (57投票s)
在本文中,我们将讨论面向服务架构及其特征
本文将不讨论如何创建和托管 WCF 服务,而是强调 SOA 和 WCF 的重要性。
如果您是高级 WCF 开发者,那么本文不适合您;如果您正在学习 WCF,那么本文也不适合您;本文是为那些对 WCF 完全陌生并试图理解 WCF 存在原因的人准备的。
目录
SOA 的演变

演变是自然法则。正如人类从灵长类动物进化到现代人类以适应不断变化的环境和竞争一样,编程风格或说技术也在不断演变,以克服不断变化的编程世界中的挑战。
过程式编程
最初,程序员使用这种方法来开发应用程序,其中函数是全部。
在这种方法中,功能被封装在一个或多个函数中,这些函数可以相互调用,传递一些参数并获得一些返回值。这里有一个函数被设为入口点(就像 C 语言中的 main 方法)。
为什么需要演变。
这种方法最大的挑战是:
- 如何重用相同的代码?
- 代码管理的困难。
面向对象编程
为了克服过程式编程中的问题,面向对象时代应运而生,人们开始谈论对象和类。一切都被视为现实世界中的对象,它们是从类这个蓝图创建出来的。在这个时代引入了许多面向对象的原则,如抽象、封装、继承、多态和 SOLID。
为什么需要演变。
面向对象编程提高了可重用性,从而改善了代码管理。但这里没有解决的一个问题是,两个或多个应用程序如何相互通信,特别是当它们是用不同的语言或技术编写的时候。例如,用 Java 编写的库存模块将无法调用用 .NET 编写的会计模块类中的函数。
面向服务的编程
我们已经从函数、对象进步到了服务。在 SOA 中,函数和任务被创建为松散连接的独立服务,通过消息进行通信。服务提供者通过标准接口在一个公共可访问的目录服务存储库中发布服务,服务消费者发出服务请求,并以服务响应作为回应。

架构术语
在深入探讨 SOA(面向服务的架构)之前,必须了解一些与架构相关的术语。
模式
简单来说,模式是在特定上下文中解决问题的方案。
架构风格
当我们说架构风格时,这是一个非常高层次的概念。如何采纳和实现它取决于我们。例如,REST 是一种架构风格,它告诉我们如何有效地使用标准的 Web 功能。它不是标准或规范,而是一种我们可以理解并以该风格设计 Web 服务的风格。在我看来,n 层也是一种架构风格,它建议将系统划分为不同的层,但中间层可以是任何东西,开发人员可以将其实现为简单的类库或 WCF 服务。事实上,“n”的值也不确定。
架构模式
架构模式是在子系统级别或简而言之模块级别解决我们问题的。它处理项目架构相关的问题。我们创建类库、组件、Web 服务来解决问题。例如,在 MVC 中,我们将应用程序分解为模型、视图和控制器。在这里,我们知道视图如何与模型交互等等。
设计模式
设计模式谈论的是类或函数级别的问题。
什么是SOA?
SOA 或面向服务的架构是一种通过服务构建业务应用程序的架构风格。应用程序由通过消息通信的服务集合组成。
Service
- 服务是自包含业务功能的逻辑封装。
- 每个服务封装一个操作,例如注册用户、发送电子邮件等。
消息
服务之间使用消息进行通信。消息是标准格式,每个人(每个服务)都可以读取和理解。
SOA 的特性
- 在 SOA 中,服务应该独立于其他服务。
更改一个服务不应影响调用方服务。 - 服务应该自包含。
当我们谈论一个 RegisterCusomer 服务时,意味着该服务将为我们完成所有必要的工作,我们不必关心任何事情。 - 服务应该能够自我描述。
服务应该能够回答“我做什么?”的问题。它应该能够告诉客户端它执行哪些操作,使用哪些数据类型,以及它会返回什么类型的响应。 - 服务应该发布到一个(目录)位置,任何人都可以搜索到。
- 正如我所说,SOA 由通过标准消息通信的服务集合组成。
标准消息使其平台无关。
(这里的标准不是指 Microsoft 内部的标准,而是指跨所有编程语言和技术的标准。) - 服务应该能够异步地相互通信。
- 服务应该支持可靠的消息传递。
这意味着保证请求能够到达正确的目的地并获得正确的响应。 - 服务应该支持安全通信。
WCF 与 Web 服务
WCF 是微软用于构建面向服务应用程序的框架。
将 Web 服务与 WCF 进行比较可能不是个好主意。你能将现在的自己与两年前的自己进行比较吗?显然,两年来你可能学到了新东西,有所进步,对吧?WCF 和 Web 服务之间就是这种关系。WCF 是从 Web 服务演变而来的,所以 WCF 可以做到 Web 服务能做的一切,还能做得更多。
WCF 的功能
- WCF 托管 - 如果我们使用 Web 服务,我们唯一的选择就是将其托管在 Web 服务器(如 IIS)中,使用 http 或 wshttp 协议。但 WCF 支持四种托管方式。
- IIS
- WAS(Windows 进程激活服务)
- 自托管
- Windows 服务
关于 WCF 托管的更多信息请访问:
http://msdn.microsoft.com/en-us/library/bb332338.aspx - 消息传输 - 消息可以通过各种传输协议和编码在客户端和服务之间传输,例如使用 http 的 SOAP 和使用 TCP 的二进制数据。
- 序列化 - Web 服务使用 XmlSerializer 在服务调用之间传输数据,而 WCF 支持多种序列化程序。
- DataContractSerializer(更快,支持版本控制)
- NetDataContractSerializer(当需要将 CLR 类型信息包含在序列化的 XML 中时)
- XmlSerializes(主要用于支持向后兼容)。
- 多种技术整合 - WCF 整合了以下四种技术。
- .NET Remoting
- MSMQ
- Web 服务
- COM+
- 消息契约 - 在 Web 服务中,自定义 SOAP 消息的头是一项繁琐的任务。为此,我们需要从 SoapHeader 派生一个类,然后使用 SoapHeaderAttribute 来指示头的存在。
但使用 WCF,我们可以借助 MessageContractAttribute、MessageHeaderAttribute 和 MessageBodyMemberAttribute 等简单属性轻松完成。 - 多种消息模式 - WCF 支持描述客户端和服务如何传递消息的三种消息模式。
- 请求-应答模式 – 客户端向服务发送消息并等待回复。
- 单向消息模式 – 客户端向服务发送消息,但服务不回复客户端。
- 双工模式 – 客户端和服务都可以发起通信。客户端调用服务的一个方法。然后服务可以使用客户端回调来调用客户端中的一个方法。
- 安全性 - 在 WCF 中,可以通过 SSL 等标准来实现安全性。
- 可靠性 - WCF 通过队列和可靠会话支持可靠消息。
- REST - WCF 可以扩展以支持未包装在 soap 报头中的纯 XML 数据,以及 ATOM 等 XML 格式和 JSON 等非 XML 标准。
- WCF 事务 - WCF 支持为服务应用程序创建分布式事务。事务是需要作为一个逻辑单元运行的一系列逻辑操作。
(要么所有操作都成功执行并完成,要么在其中任何一个失败的情况下,其他操作都会回滚)。 - WCF 实例 - 在 WCF 中,我们可以控制 WCF 服务对象在 WCF 服务器中实例化的方式。WCF 框架提供了以下实例化模型:
- 按调用 - 每次客户端请求都会创建一个新实例。
- 按会话 - 为每个新客户端会话创建一个新实例,并在该会话的生命周期内维护。
- 单例 - 单个实例处理应用程序生命周期内的所有客户端请求。
- WCF 并发 - 利用 WCF 并发功能,我们可以控制服务实例如何同时处理多个请求。我们有三种选择:
- 单线程 – 一次只处理一个请求。
- 多线程 - WCF 服务对象可以在任何给定时间处理多个请求。
- 重入 - 单个请求线程可以访问 WCF 服务对象,但该线程可以退出 WCF 服务以调用另一个 WCF 服务,也可以通过回调调用 WCF 客户端并重新进入而不发生死锁。
WCF 中的 ABC 是什么
我们已经了解了 WCF 的功能,并理解了为什么它被誉为 Web 服务的升级版。现在是时候回答一个与 WCF 相关的非常基本的问题了,即 WCF 的 ABC 是什么?
当我们提到 WCF 时,我们会遇到终结点。服务终结点可以是托管在 IIS 中的持续托管服务的一部分,也可以是托管在应用程序中的服务。
ABC 或地址(Address)、绑定(Binding)和契约(Contract)是构成服务终结点的三个要素。
- 地址 - 服务所在的位置(服务的 URL)。
- 绑定 – 如何与服务通信? 例如 – basicHttpBinding、wsHttpBinding、webHttpBinding 等。
- 契约 – 服务能为我做什么?
结论
我们已经理解了:
- 什么是面向服务的架构?
- 为什么需要 SOA?
- SOA 的特性有哪些?
- WCF 如何与 Web 服务区分?
- WCF 的特性有哪些?
- WCF 的 ABC 是什么意思?
在接下来的文章中,我们将尝试更详细地讨论 WCF 的各项功能。
希望大家喜欢阅读这篇文章。感谢您的耐心。
如需与 ASP.NET、设计模式、WCF 和 MVC 等各种主题相关的技术培训,请联系 SukeshMarla@Gmail.com 或访问 www.sukesh-marla.com。