选择传输方式
本主题介绍在 Windows Communication Foundation (WCF) 包括的以下三种主要传输中进行选择的条件:HTTP、TCP 和命名管道。 WCF 还包括消息队列(也称为 MSMQ)传输,但本文档不讨论消息队列。
WCF 编程模型将终结点操作(在服务协定中表示)与连接两个终结点的传输机制分隔开。 这样,在您决定如何向网络公开服务时,就具有一定的灵活性。
在 WCF 中,可以通过使用“绑定”(由一系列的绑定元素组成)来确定如何在终结点之间通过网络传输数据。 传输由传输绑定元素(绑定的一部分)表示。 绑定包括可选的协议绑定元素(如安全)、必需的消息编码器绑定元素和必需的传输绑定元素。 传输会将消息的序列化形式发送到另一个应用程序,或者从另一个应用程序接收消息的序列化形式。
如果必须连接到现有的客户端或服务器,则您可能不能选择使用特定传输。 但是,可以通过多个终结点(每个都有一种不同的传输方式)来访问 WCF 服务。 当单一传输方式不能涵盖您的服务目标受众时,请考虑通过多个终结点来公开服务。 这样,客户端应用程序就可以使用最适合的终结点。
在选择传输方式后,必须选择一个使用此传输方式的绑定。 你可以选择系统提供的绑定(请参阅系统提供的绑定),也可以生成自己的自定义绑定(请参阅自定义绑定)。 还可以创建自己的绑定。 有关详细信息,请参阅创建用户定义的绑定。
每种传输方式的优点
本节介绍在三种主要传输方式中选择其中之一的主要理由,包括一个用于进行选择的详细决策表。
适合使用 HTTP 传输的情况
HTTP 是客户端与服务器之间的一个请求/响应协议。 最常见的应用程序包括与 Web 服务器进行通信的 Web 浏览器客户端。 该客户端向服务器发送一个请求,服务器侦听客户端请求消息。 当服务器接收到一个请求时,会返回响应,其中包含请求的状态。 如果成功,将返回可选数据,例如网页、错误消息或其他信息。 有关 HTTP 协议的详细信息,请参阅 HTTP - 超文本传输协议。
HTTP 协议不是基于连接的 - 一旦发送了响应,就不会再维护任何状态。 要处理多页事务,应用程序必须持续保持任何必要的状态。
在 WCF 中,HTTP 传输绑定针对与传统非 WCF 系统的互操作性进行了优化。 如果所有通信方都使用 WCF,则使用基于 TCP 或基于命名管道的绑定会更快。 有关详细信息,请参阅 NetTcpBinding 和 NetNamedPipeBinding。
适合使用 TCP 传输的情况
TCP 是一个基于连接、面向流的传递服务,具有端对端错误检测和更正功能。 “基于连接”表示在交换数据之前在主机之间建立一个通信会话。 主机是 TCP/IP 网络上由逻辑 IP 地址标识的任意设备。
TCP 提供可靠的数据传递,并且易于使用。 具体地说,TCP 会通知发送方开始传递包,保证按发送时同样的顺序传递这些包,重新传送丢失的包,并确保数据包不重复。 请注意,这种可靠的传递方式适用于两个 TCP/IP 节点之间,与 WS-ReliableMessaging 不同,后者适用于两个终结点之间,而不考虑它们可能包括多少个中间节点。
WCF TCP 传输已针对通信的两端均使用 WCF 的方案进行了优化。 对于涉及不同计算机之间的通信的方案,此绑定是最快的 WCF 绑定。 消息交换使用 BinaryMessageEncodingBindingElement 来实现优化的消息传输。 TCP 提供双工通信,因此可以用于实现双工协定,即使客户端位于网络地址转换 (NAT) 的后端也没有关系。
适合使用命名管道传输的情况
命名管道是 Windows 操作系统内核中的一个对象,例如,进程可用于通信的一个共享内存区段。 命名管道具有一个名称,可用于单一计算机上的进程之间的单向或双工通信。
当一台计算机上的不同 WCF 应用程序之间要求通信,并且你希望阻止来自另一台计算机的任何通信时,请使用命名管道传输。 另一个限制就是:从 Windows 远程桌面运行的进程可能只能用于同一 Windows 远程桌面会话,除非它们具有提升的特权。
警告
当在 IIS 中承载的多个网站上对弱通配符 URL 预留使用命名管道传输时,可能会发生以下错误:尝试侦听站点“2”时,在协议“net.pipe”的激活服务“NetPipeActivator”中发生错误。因此对该站点暂时禁用了该协议。 有关详细信息,请参见异常消息。 URL: WeakWildcard:net.pipe:/<计算机名>/ 状态: ConflictingRegistration 异常: 进程名称: SMSvcHost 进程 ID: 1076\
选择传输方式的决策点
下表列出了选择传输方式的常用决策点。 您应该考虑适合您的应用程序的其他所有属性和传输方式。 识别对您的应用程序非常重要的属性,识别对每个属性有益的传输方式,然后选择最适合您的属性集的传输方式。
属性 | 说明 | 适合的传输方式 |
---|---|---|
诊断 | 使用诊断可自动检测传输的连接性问题。 所有传输方式均支持发回描述连接性的错误信息这一功能。 不过,WCF 不包含用于调查网络问题的诊断工具。 | 无 |
Hosting | 所有 WCF 终结点必须承载在应用程序内。 IIS 6.0 和更低版本仅支持承载使用 HTTP 传输的应用程序。 Windows Vista 中添加了对承载所有 WCF 传输(包括 TCP 和命名管道)的支持。 有关详细信息,请参阅在 Internet Information Services 中承载和在 Windows 进程激活服务中承载。 | HTTP |
检查 | 检查是在传送期间从消息中提取并处理信息的功能。 HTTP 协议会从数据中分离出路由和控制信息,使得可以更方便地生成用于检查和分析消息的工具。 易于检查的传输方式还可能要求网络设备中有较低的处理能力。 使用的安全级别会影响是否可以检查消息。 | HTTP |
延迟 | 滞后时间是指完成消息交换所需的最少时间。 所有网络操作都具有或长或端的滞后时间,具体取决于选择的传输方式。 由于消息的强制相关性,利用固有消息交换模式为请求-答复的传输方式(如 HTTP)进行双工或单向通信会导致滞后时间增加。 这种情况下,请考虑使用固有消息交换模式为双工的传输方式,如 TCP。 | TCP、命名 管道 |
Reach | 传输的连接距离反映了传输在与其他系统连接时的能力。 命名管道传输的连接距离很小;它只能连接到在同一计算上运行的服务。 TCP 和 HTTP 传输方式都有很好的连接距离,并可以渗透某些 NAT 和防火墙配置。 有关详细信息,请参阅使用 NAT 和防火墙。 | HTTP、TCP |
安全性 | 安全性是在传输期间通过提供保密性、完整性或身份验证来保护消息的能力。 保密性使消息免于检查,完整性防止消息被修改,身份验证保证消息发送方或接收方的身份。 WCF 在消息级别和传输级别均支持传输安全性。 如果传输支持缓冲传输模式,则消息安全性与传输组合在一起。 对传输安全性的支持会根据您所选择的传输方式而有所不同。 HTTP、TCP 和命名管道传输利用合理的奇偶校验对传输安全提供支持。 |
All |
吞吐量 | 吞吐量度量指定的时间内可以传送和处理的数据量。 与滞后时间类似,选择的传输方式会影响服务操作的吞吐量。 将传输的吞吐量最大化要求尽量减小传送内容的开销,并尽量缩短等待消息交换完成的时间。 TCP 和命名管道传输使消息正文增加的开销都不大,并支持减少消息答复等待时间的固有双工形状。 | TCP、命名管道 |
工具 | 工具表示对用于开发、诊断、承载和其他活动的协议的第三方应用程序支持。 开发工具和软件以便与 HTTP 协议协同工作意味着巨大的投资。 | HTTP |