[MSDN]WCF(12).详解传输

说明:本内容来自微软的webcast,讲师为徐长龙。为了用手机阅读方便点,抄录存为txt。

本次课程内容包括
- 选择传输方式
- 选择消息编码器
- 传输配额
- Net.TCP 端口共享


选择传输方式
- 传输层是通道堆栈的最底层。 WCF 中使用的主要传输有 HTTP, TCP 和 命名管道。
- WCF 编程模型将终结点操作(如服务协定中所表示)与连接两个终结点的传输机制分隔开,这样决定如何向网络公开服务时,就具有一

定的灵活性。
- 在 WCF 中,您可以通过使用 ”绑定“(由一系列的绑定元素组成)来确定如何在终结点之间通过网络传输数据。
- 传输有传输绑定元素(绑定的一部分)表示。绑定包括可选的协议绑定元素(如安全)、必需的消息编码器绑定元素和必需的传输绑定元

素。
- 传输会讲消息的序列化形式发送到另一个应用程序,或者从另一个应用程序接收消息的序列化形式。
- 在选择传输方式后,必须选择一个使用此传输方式的绑定。
- 适合使用 HTTP 传输的情况
  - HTTP 是客户端与服务器之间的请求/响应协议。
  - 最常见的应用程序包括与 Web 服务器进行通信的 Web 浏览器客户端。该客户端向服务器发送一个请求,服务器侦听客户端请求消息。

当服务器接收到一个请求时,会返回响应,其中包含请求的状态。如果成功,将返回可选的数据,如网页、错误消息或其他信息。
  - HTTP 协议不是基于连接的 - 一旦发送了响应,就不会再维护任何状态。要处理多页事务,应用程序必须持续保持任何必要的状态。
  - 在 WCF 中,HTTP 传输绑定针对与旧式非 WCF 系统的互操作性进行了优化。如果所有通信方都使用的是 WCF ,则使用基于 TCP 或

命名管道的绑定会更快。
- 适合使用 TCP 传输的情况
  - TCP 是一个基于连接、面向流的传递服务,具有端到端错误检测和更正功能。”基于连接“表示在交换数据前建立主机主机之间的一个

通信会话。
  - TCP 提供可靠的数据传递,并且易于使用。具体地说,TCP 会通知发送方开始传递包,保证按发送同样的顺序传递这些包,重新传递丢

失的包,并确保数据包不重复。
  - WCF TCP 传输已针对通信的两端均使用 WCF 的情形进行了优化。对于涉及到不同计算机之间的通信的情形,此绑定是最快的 WCF 绑

定。消息交换使用 BinaryMessageEncodingBindingElement 来实现优化的消息传输。
  - TCP 提供双工通信,因此可以用于实现双工协定,即使客户端位于网络地址(NAT)的后端也没有关系。
- 适合使用命名管道传输的情况
  - 命名管道是 Windows 操作系统内核中的一个对象,例如,进程可用于通信的一个共享内存区段。命名管道具有一个名词,可用于单一

计算机上的进程之间的单向或双工通信。
  - 当一台计算机上的不同 WCF 应用程序之间要求通信,并且您希望阻止来自另一个计算机的任何通信是,请使用命名管道传输。另一个

限制就是:从 Windows 远程桌面运行的进程可能只能用于同一 Windows 远程桌面会话,除非它们具有提升的特权。
*传输方式比较表格,略*


选择消息编码器
- 在 WCF 中,可以通过绑定()来确定任何在终结点之间通过网络传输数据。
- 消息编码器由绑定堆栈中的消息编码绑定元素表示。绑定包括多个可选择协议绑定元素(如安全绑定元素或可靠消息绑定元素)、一个必

需的消息编码绑定元素以及一个必需的传输绑定元素。
- 消息绑定元素位于可选协议绑定元素之下和必需的传输绑定元素之上。在传出端,消息编码器序列化传出 Message 并将其传递到传输层

。在传入端,消息编码器从传输层接收已序列化的 Message 并将其传递到更高的协议层(如果存在),如果不存在此协议层,则传递到应

用程序。
- 当练级到预先存在的客户端或服务器时,因为您需要将消息以另一端预期的方式来解码,所有您不能选择使用特定消息编码。但是,如果

您正在编写一个 WCF 服务,您可以通过多个终结点公开服务,每个终结点使用不同的消息编码。这使客户端可以选择最佳的编码以通过最

适合的终结点与您的服务通话,还使客户端可以灵活地选择最适合的编码。
- 系统提供的编码器
  - TextMessageEncodingBindingElement, 文本消息编码器,同时支持纯 XML 编码和 SOAP 编码。文本消息编码器的纯 XML 编码模式

称为”纯旧式 XML“(POX),以便与基于文本的 SOAP 编码进行区分。若要启用 POX ,请将 MessageVersion 属性设置为 None。使用

文本消息编码器可以与非 WCF 终结点交换操作。
  - BinaryMessageEncodingBindingElement, 二进制消息编码器,使用精简的二进制格式并为 WCF 到 WCF 通信进行了优化,因此不可

互操作。它也是 WCF 提供的所有编码器中性能最佳的编码器。
  - MTOMMessageEncodingBindingElement,绑定元素,指定使用 MTOM 编码的消息的字符编码和消息版本。 MTOM 是一种用于在

WCF 消息中传输二进制数据的有效技术。 MTOM 编码器会尝试在效率和互操作之间建立平衡。 MTOM 编码以文本形式传输大多数 XML

, 但是按原样传输较大的二进制数据块,而不是将其转换为文本,一次对其进行优化。就效率而言,在 WCF 提供的编码器中, MTOM

介于在文本编码器(最慢)和二进制编码器(最快)之间。
  *消息编码器比较表格,略*


传输配额
- 传输配额是一种策略机制,用于决定连接何时正在占用过多资源。配额是一种硬性限制,它在超出配额值时立即禁止使用其他资源。传输

配额可防止恶意或无意的拒绝服务攻击。
- WCF 传输的默认配额值基于资源的保守分配。这些默认值适合于开发环境和小型安装方案。如果某个安装耗尽了资源或是连接受到限制

,则无论是否还有其他资源可用,服务管理员都应检查传输配额并调整各个配额值。
- 传输配额的类型
- WCF 传输具有三种类型的配额:
  - ”超时“可减少通过长时间占用资源来实施的拒绝服务攻击。
  - ”内存分配限制“可防止单个连接耗尽系统内存并拒绝为其他连接提供服务。
  - ”集合大小限制“可限制对间接分配内存或限量供应的资源的消耗。
  *配额相表格,略*

Net.TCP 端口共享
- WCF 提供了一种新的用于高性能通信的、基于 TCP 的网络协议 (net.tcp://) 。
- WCF 还引入了一个新的系统组件 Net.TCP Port Sharing Service, 该组件使得 net.tcp 端口可以在多个用户进程之间共享。
- 背景和动机
  - 刚开始引入 TCP/IP 协议时,只有少量应用程序协议使用它。TCP/IP 通过为每一个应用程序协议分配一个唯一的16位端口号,从而使用

端口号来区分应用程序。例如,HTTP 通信现在已经统一为使用 TCP 端口80,SMTP 使用 TCP 端口25,FTP 使用 TCP 端口 20 和 21. 其

他使用 TCP 作为传输协议的应用程序的应用程序可以按习惯或遵循正式标准选择其他可用的端口号。
  - 可使用端口号区分存在安全问题的应用程序。除少数几个已知的入口点之外,防火墙通常会配置为阻塞 TCP 通信,因此,部署使用费标

准端口的应用程序经常会因为存在公司防火墙和个人防火墙而变得复杂或者甚至无法实现。通过已得到允许的标准已知端口进行通信的应用

程序可减少外部攻击面。许多网络应用程序使用 HTTP 协议,这是因为大多数防火墙在默认情况下会配置为允许 TCP 端口 80 上的通信。
  - 在 HTTP.SYS 模型中,许多不同的 HTTP 应用程序的通信中将多路复用到单个 TCP 端口。此模型已经成为 Windows 平台上的标准。

这位防火墙管理员提供了一个公共控制点,同时可以让应用程序开发人员尽可能降低生产可利用网络的新应用程序的部署成本。
  - 在多个 HTTP 应用程序之间共享端口的能力早已成为 Internet 信息服务(IIS)的一个功能。但是,只有在引入 IIS6.0 附带的

HTTP.SYS (核心模式 HTTP 协议侦听器)之后,此基础结构才完全得到广泛使用。实际上,HTTP.SYS 允许任意用户进程共享专用于

HTTP 通信的 TCP 端口。 此功能可以让许多 HTTP 应用程序在同一个物理计算机共存于不同的独立进程中,同时共享通过 TCP 端口 80 发

送和接收通信所需要的网络基础结构。Net.TCP Port Sharing Service 支持为 net.tcp 应用程序共享相同类型的端口。
- 端口共享结构
  - WCF 中的端口共享结构有三个主要组件:
    - 辅助进程:任何使用共享端口通过 net.tcp:// 通信的进程。
    - WCF TCP 传输协议: 实现 net.tcp:// 协议。
    - Net.TCP Port Sharing Service: 允许许多辅助进程共享同一 TCP 端口。
  - Net.TCP Port Sharing Service 是用户模式的 Windows 服务,可代表通过其连接的辅助进程接收 net.tcp:// 连接。当套接字连接到达

时,端口共享服务将检查传入消息流以获取器目标地址。基于此地址,端口共享服务可以将数据流路由到最终处理它的应用程序。
  - 当使用 net.tcp:// 端口共享的 WCF 服务打开时, WCF TCP 传输协议基础结构不会再应用程序进程中直接打开 TCP 套接字。传输协议

基础结构而是想 Net.TCP Port Sharing Service 注册服务的基址统一资源标识符(URI),并且等待端口共享服务代表它侦听消息。端口

共享服务将对到达的发送给该应用程序服务的消息进行调度。
- 安装端口共享
  - Net.TCP Port Sharing Service 可用于支持 .NET Framework 3.0 的所有操作系统,但是默认情况下不启用该服务。作为一项安全预防

措施,管理员必须在第一次使用前手动启动 Net.TCP Port Sharing Service。Net.TCP Port Sharing Service 会公开一些配置选项,从而

让您可以操作端口共享服务所拥有的网络套接字的若干特性。
- 在应用程序中使用 Net.tcp 端口共享
  - 在 WCF 应用程序中使用 net.tcp:// 端口共享的最简单方式是,使用 NetTcpBinding 公开一个服务,然后使用 PortSharingEnable 属

性启用 Net.TCP Port Sharing Service。
  配置文件方式:
   <bindings>
    <netTcpBinding>
     <binding name="PortSharingBinding" portSharingEnabled="true">
      <security mode="None"/>
     </binding>
    </netTcpBinding>
   </bindings>
   代码方式:
   NetTcpBinding binding = new NetTcpBinding();
   binding.PortSharingEnabled = true;
- 端口共享的安全性影响
  - 虽然 Net.TCP Port Sharing Service 在应用和网络之间提供了一个处理层,但是仍应对使用端口共享的应用程序进行保护,就好像这些

应用程序直接在网络上进行侦听一样。具体来说,使用端口共享的应用程序应评估运行它们所依据的进程特权。请考虑使用内置网络服务帐

户运行应用程序,该内置服务账户将以网络通信要求的最小进程特权集运行。

人的一生应该这样度过:当他回首往事的时候,不会因为虚度年华而悔恨,也不会因为碌碌无为而羞愧。
原文地址:https://www.cnblogs.com/htht66/p/2329241.html