写点什么

在.NET Framework 3.5 中的 WCF 通信选项

  • 2008-01-24
  • 本文字数:3019 字

    阅读完需:约 10 分钟

Chappell & Associates 的负责人 David Chappell 在他撰写的一篇白皮书《处理多样性:理解.NET Framework 3.5 中的WCF 通信选项》中,为我们展现了WCF 所提供的各种通信方式。

针对分布式系统开发中会遇到的各种通信选项,微软发布的 Windows Communication Foundation 为其提供了一种单一的编程模型。这一组选项涵盖了从内部处理通信到端对端网络通信的诸多方面。在过去,每一种通信模型都对应了一种特定的编程模型。“如果为多种通信方式提供一个通用的编程模型,就能够帮助开发者有效地处理各种多样性”,David Chappell 说道。

白皮书一开始就介绍了两种主要的负责处理多样性的 WCF 概念:

从一开始,WCF 的创建者就认识到应用程序会有多个不同的通信需求。同时,他们也确信会有新的通信方式不断出现。为了应对这样的现实问题,WCF 提供了一个通用的体系架构,以支持不同的通信方式。这种体系架构最突出的两个理念就是通道与绑定 […]。

在 WCF 中,每一次交互可以被看作是一次消息交换。消息包含了一次访问负载以及在一次传输过程任意数量的基础设施数据。为了处理不同的现有以及未来的通信方式,WCF 引入了通道模型。每种通道对应一个特定的基础设施方向,例如安全性或者可靠性。一套完整的基础设施需要一个单独的通信选项,而该选项则由预先定义或自定义的通道堆栈进行处理:

无论是客户端,还是服务,或者两者,通过 WCF 进行通信的所有软件均依赖于一个或多个通道。[…] 通道堆栈基于 WCF 客户端或服务与它所依赖的通信机制之间进行创建。在堆栈中最底层的通道所做的工作是相同的,即负责将要传递的消息与用来传输该消息的相关机制映射起来。因此,这一最底层的组件通常被称之为“传输通道”。

WCF 通过引入绑定的方式允许对通道堆栈进行便捷的配置与定义:

通过指定一个特定的绑定,WCF 客户端或者服务隐式地创建了实现一组特定通信行为的通道堆栈。[…] 一个特定的 WCF 接口所定义的服务可以通过该绑定进行访问 […] 或者通过多个绑定同时进行访问 […]。

下面的内容阐释了 David Chappell 所介绍的.NET Framework 3.5 提供的所有通信选项的体系架构:

SOAP 和 WS-* Web Service

作为微软推出的针对面向服务体系架构的技术,WCF 的构建目的在于开发 SOAP/WS-* 的 Web Service:

  • WCF 允许传递基于任意传输类型例如 HTTP 或 TCP 的 SOAP/WS-* 消息。
  • 支持最重要的 WS- 规格 - 在.NET Framework 3.5 的 MSDN 文档中,提供了一个扩展的概要介绍《由系统提供的互操作性绑定支持的 Web Service 协议》。
  • 能够强制要求服务遵循 Web Services Interoperability Organization (WS-I) Basic Profile 1.0。
  • WCF 针对通用的 Web 服务场景提供了一套预定义的绑定。

WCF 应用程序之间的二进制通信

适用于 WCF 到 WCF 之间的通信 > WCF 支持使用更加有效的二进制编码方式进行通信。不仅可以通过 HTTP 传递标准的基于 XML 的 SOAP 消息,开发者还可以选择直接通过 TCP 传递在表示方式上更加有效的相同的信息。

REST 化(RESTful)的 Web Service

由于 REST 方式的 Web Service 越来越普及,因此在.NET Framework 3.5 中,WCF 也支持 REST 方式。事实上,虽然 WCF 的第一个版本专注于基于 SOAP 的服务,但是“通用的通道模型完全能够添加对 REST 通信最直接的支持”。首先,WCF 消息必须去除 SOAP 信封以及标头,这一点可以使用新增加的 WebHttpBinding:

与 [其他的] 基于 HTTP 的绑定不同 […],该绑定使用了一个编码项 WebMessageEncoding,这是.NET Framework 3.5 版本中的 WCF 新增加的特性。该选项不会添加或移除 SOAP 标头。相反,它会为呈现的内容实现三种不同的选项:基于文本的 XML 编码,JSON 编码和不透明的二进制编码,后者对于某些场景会非常有用,例如传递 JPEG 文件。作为一种 HTTP 绑定,出于安全性考虑,WebHttpBinding 同样可以被配置为使用 HTTPS。

操作会被映射为 HTTP 动作,例如 GET,PUT,POST 或者 DELETE,可以通过 WebGet 或 WebInvoke 特性在 WCF 的服务契约上进行标记。因为 REST 方式“必然意味着要操作 URIs”,WCF 提供某种手段来负责管理“大量相似的 URIs”:URI 模板。“这些模板的目的在于简化开发者表示 URI 模式以及处理匹配这些模式的 UIRs 的工作”

POX 与 Syndication(RSS,ATOM)

使用 WCF 的 REST 模式,可以发送 POX(Plain Old XML)消息或者使用联合(Syndication)格式。

POX,RSS 和 ATOM 均为格式,而非协议。正因为此,并不需要特定的 WCF 绑定来使用它们。通常,它们都可以直接通过 HTTP 进行传送,由于没有 SOAP 标头,因此绑定的最佳选择是使用 WebHttpBinding。

商务营运(LOB)应用程序的通信

WCF 支持正在开发的客户端与不提供 Web Service 接口的应用程序之间的通信:

对此,一个重要的范例就是与 LOB 应用程序的通信,例如 SAP。[…]

对此的支持正是 WCF Line-of-Business (LOB) Adapter SDK 的目标。正如“SDK”其名所示,该技术自身并不包含任何适配器。相反,它提供了一些工具和运行时环境以帮助创建面向 LOB 应用程序的适配器。然后,应用程序的开发者就可以使用这些适配器创建 WCF 客户端,以调用 LOB 应用程序的服务,就好似该应用程序就是一个普通的 WCF 服务那样。

通过消息队列进行通信

为了使用消息队列进行通信

[…] WCF 提供了一个 MSMQ 传输通道。若要使用队列通信,开发者可以创建一个标准的 WCF 服务,并按照通常的方式为该服务接口以及方法分别标记 ServiceContract 标志和 OperationContract 标志。同时,应该将接口中每个操作的 OperationContract 标志的 IsOneWay 属性标记为 true。[…]

只有二进制消息可以通过 MSMQ 进行传送,该消息既可以被 SOAP 信封所包裹,也可以不使用 SOAP 信封。 通过 Windows 点对点(Peer-To-Peer)网络的通信

Windows 点对点网络主要用于协作场景。在端系统中,单台 PC 机同时作为客户端与服务器(多个端点)

通常,WCF 应用程序可以通过指定正确的绑定使用 Windows 端对端网络。NetPeerTcpBinding[…] 依赖于指定了端通信的传输通道。该绑定也可以被置于 PnrpPeerResolver 通道中,通过它处理传送时的寻址操作,以使得消息能够传递到指定的端系统图中。

内进程通信

WCF 支持 [同一台机器进程之间的通信],使用的绑定为 NetNamedPipeBinding[…]。 它并不依赖于实现了网络协议如 HTTP 或 TCP 的传输通道,而是使用命名管道进行通信的传输通道,这是内进程通信的一个标准 Windows 机制。

自定义通信

WCF 提供了多种扩展与定制通信选项的途径。开发者可以创建定制通道,定制绑定以及自定义现有的绑定。Davide Chappell 在文章 Microsoft BizTalk Services 中“提供了对此技术的有趣的阐释”。

根据 David Chappell 所述,“针对通信的一个具有通用目的的平台意义非凡”。WCF“利用一个通用的框架提供对多种通信方式的支持”,并且易于扩展和定制。

查看英文原文: WCF Communication Options in the .NET Framework 3.5


译者介绍:张逸(Bruce Zhang),毕业于四川大学计算机学院,文学爱好者,微软最有价值专家(MVP)。曾先后任职中兴通讯重庆研究所以及惠普 GDCC。拥有 10 年左右的软件开发与 5 年左右的软件架构设计经验,熟悉 C#,ASP.NET,Web Service,.NET Remoting,WCF 等技术。在面向对象领域具有一定造诣,特别是设计模式、测试驱动开发、极限编程与 UML 等技术与思想的运用。目前,主要从事 SOA 企业信息解决方案的设计与研究。著作 / 译作包括《软件设计精要与模式》、《WCF 服务编程》。他的个人主页为 http://www.brucezhang.com。

2008-01-24 21:311789
用户头像

发布了 109 篇内容, 共 40.8 次阅读, 收获喜欢 14 次。

关注

评论

发布
暂无评论
发现更多内容

Prometheus Exporter (十三)Elasticsearch Exporter

耳东@Erdong

elasticsearch Prometheus exporter 11月日更

云原生训练营作业--部署k8s集群

好吃不贵

HyperLogLog这里面水很深,但是你必须趟一趟

李子捌

redis 签约计划第二季

数据库不能没有事务,今天他来了——Redis事务详述

李子捌

redis 事务 签约计划第二季

Redis高可用的绝对的利器——持久化(RDB和AOF)

李子捌

redis redis持久化 签约计划第二季

限流系列文章——令牌桶限流

李子捌

redis 限流 签约计划第二季

CSS之盒模型

Augus

CSS 11月日更

URL URI傻傻分不清楚,dart告诉你该怎么用

程序那些事

flutter dart 程序那些事 11月日更

限流系列文章——漏斗限流

李子捌

redis 限流 签约计划第二季

为什么我的 C4C Service Request 没办法 Release 到 ERP?

汪子熙

Cloud SAP abap C4C 11月日更

转型中的学习型组织 ——阅读《第五项修炼》有感

研发管理Jojo

系统性思考 企业转型

都在用MQ,Redis的Pub/Sub也可以试着了解下

李子捌

redis MQ 签约计划第二季

签到功能怎么做?Bitmaps助你一臂之力

李子捌

redis bitmaps 签约计划第二季

Skip List(跳跃列表)它到底好在哪?今天我们不仅只聊为什么,还手写一个玩玩

李子捌

redis skiplist 签约计划第二季

[Pulsar] 消息从Producer到Broker的历程

Zike Yang

Apache Pulsar 11月日更

李子捌 Redis精通系列文章 研究分享| 内容合集

李子捌

redis 内容合集 签约计划第二季 技术专题合集

新成就!OceanBase 入选 Forrester 首份分布式数据库报告

OceanBase 数据库

数据库 开源 新闻 oceanbase 荣誉

数据分析从零开始实战,Pandas读写Excel/XML数据

老表

Python 数据分析 Excel pandas 11月日更

听说你的服务经常被打崩?试试布隆过滤器(Bloom Filter)

李子捌

redis 布隆过滤器 签约计划第二季

2021年大数据开发发展趋势

五分钟学大数据

11月日更

Flutter 中的手势【Flutter 专题10】

坚果

flutter 签约计划第二季

在线文本交集计算工具

入门小站

工具

Linux 调优之:调整 bond hash 策略提升网络吞吐能力

卫智雄

k8s statefulset controller源码分析

良凯尔

源码 Kubernetes 源码分析 #Kubernetes#

跟小师妹一起学JVM-系列文章

程序那些事

Java JVM JIT 内容合集 签约计划第二季

JSON 数据格式

大数据技术指南

11月日更

Redis之Geospatial,助你轻松实现附近的xx功能

李子捌

redis geospatial 签约计划第二季

限流系列文章——滑动窗口限流

李子捌

redis 限流 签约计划第二季

【高并发】如何使用Java7提供的Fork/Join框架实现高并发程序?

冰河

Java 并发编程 多线程 高并发 异步编程

SAP Cloud for Customer Price 计价简介

汪子熙

Cloud SAP C4C 11月日更 pricing

音视频理论(1)- 音频格式之 Monkeys Audio(APE)

liuzhen007

签约计划第二季

在.NET Framework 3.5中的WCF通信选项_SOA_Hartmut Wilms_InfoQ精选文章