NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

在.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:311705
用户头像

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

关注

评论

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

StratoVirt 中的 PCI 设备热插拔实现

openEuler

开源 操作系统 虚拟机 openEuler

编译器优化那些事儿(6):别名分析概述

openEuler

开源 编译器 openEuler 毕昇 JDK

【Python实践】使用Python实时语音控制电脑全局音量

迷彩

人工智能 语音识别 9月月更 控制电脑 语音控制

跟着卷卷龙一起学Camera--内存池浅析04

卷卷龙

ISP 9月月更

阿里被转载上100W次的Java面试题教程!已助我拿下9家大厂offer!

钟奕礼

Java 架构 后端 java面试

一次 Rancher 和 openEuler 的上云之旅

openEuler

Linux 开源 openEuler rancher suse

开源实习 | 毕昇JDK发布国密算法实习任务

openEuler

开源 openEuler 毕昇 JDK

面试突击87:说一下 Spring 事务传播机制?

王磊

Java 面试

千峰课程网安笔记(1)

吉师职业混子

9月月更

Embedded SIG | 树莓派的UEFI支持和网络启动

openEuler

开源 树莓派 操作系统 openEuler

如何在笔记本上安装openEuler 22.03 LTS

openEuler

开源 操作系统 openEuler

openEuler 资源利用率提升之道 04:CPU 抢占和 SMT 隔离控制

openEuler

开源 openEuler

这个C4D短片有点辣!热情起舞小金链尽显墨西哥黑帮气质

Renderbus瑞云渲染农场

影视制作 Renderbus瑞云渲染 3D电影制作

阿里面试官内部题库,阿里发布2022年Java岗(正式版)面试题

程序知音

Java java面试 后端技术 秋招 Java面试八股文

2021 金三银四面试必备?体系化带你学习:分布式进阶技术手册

钟奕礼

Java 架构 后端 java面试

iMazing怎么恢复备份?iMazing恢复备份教程分享

淋雨

ios iphone

【云原生 | 从零开始学Kubernetes】十一、k8s污点、容忍度和pod状态

泡泡

Docker 云计算 云原生 k8s 9月月更

设计消息队列存储消息数据的 MySQL 表格

张立奎

揭开HPC应用的神秘面纱

openEuler

开源 openEuler

iMazing高效便捷的数据转移功能

淋雨

ios iphone

GitHub获百万推荐的面试涨薪秘籍(Java岗)惨遭封杀?

钟奕礼

Java 后端 java面试 后端架构

开源之夏 | 【结项报告】毕昇Fortran编译器内联动态库函数str_copy

openEuler

开源 操作系统 openEuler 毕昇 JDK

大模型的禾下乘凉梦,百度自己来做试验田

脑极体

数据治理的核心:维度建模下的数仓构建

Taylor

数据仓库 维度建模 维度 数仓分层 分层划域

我也不想学之PHP系列(2)

吉师职业混子

9月月更

车企如何完善车载小程序生态安全

Geek_99967b

小程序

破解windows系统密码

吉师职业混子

9月月更

【编程实践】利用 Python 调用图灵机器人 API 实现实时语音聊天及自动回复

迷彩

Python 实时语音 实时聊天 9月月更

八家知名大厂联合手写的Java面试手册刚上线!竟就到达巅峰?

钟奕礼

Java 架构 后端 java面试

别让你的 SaaS 产品由赋能变为“负能”

产品海豚湾

产品设计 产品运营 SaaS平台 B端产品 9月月更

【docker】软链接迁移docker存储目录

非晓为骁

Docker 存储 迁移

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