在WCF的实际应用中,有可能存在10M,100M甚至G级别的传输,这个时候我们就不得不考虑编码和传输模式,当然得选择相应的绑定(binding)

如上图所示,我可以直接使用系统提供的相应绑定,然后设置需要的模式即可,要启用MTOM消息编码,要选择相应的绑定,如BasicHttpBinding或者WSHttpBinding,然后将该绑定的messageEncoding设为Mtom,而流模式则有BasicHttpBinding,NetTcpBinding和NetNamedPipeBinding三种绑定,设置transferModel的值为Streamed。当然也可以自定义绑定,然后设置所需的编码和传输模式。

<customBinding>
  <binding name="TestCustomBinding">
    <textMessageEncoding messageVersion="Soap12WSAddressing10" />
    <httpTransport transferMode="/>
  </binding>
</customBinding>

如上所示使用的是TextMessageEncodingBindingElement编码,WCF的编码器有三个:

TextMessageEncodingBindingElement文本消息编码器是默认的编码器,读取和编写标准SOAP1.1/SOAP1.2文本消息,不会对二进制消息做任何处理。

MtomMessageEncodingBindingElement文本编码器实现对二进制数据的处理,默认情况下,任何绑定都不会使用。仅当二进制数据的大小超多1kb的时候才会具有优势,如果启用了MTOM编码,但是二进制数据并未超过1kb,则还是使用basic64编码。

BinaryMessageEncodingBindingElement是Net*绑定的默认编码器,基于通信双方都是WCF。

如果对互操作性要求较高,文本消息编码是最优解,而二进制则是其他任意通信路径的最佳选择。

上面简单介绍了编码模式,再说说传输的流模式,未启用流模式时,WCF以整体缓冲的模式来处理消息,正如文章开头将的那样如果是大型数据,将会耗尽整个系统的资源。流模式是当数据无法分段、消息必须以及时的方式传输或者当传输启动时数据还未完全就绪时考虑启动的模式,或者说流模式只能对大型数据启用。有得必有失,当启用流模式时,我们无法做到以下:

1、无法对消息正文进行数字签名,因为数字签名需要对整个消息内容进行哈希计算,采用流模式时,构造和发送消息头时,正文还未完全就绪,因此无法进行签名。

2、只能对流采用传输级安全,并且无法打开可靠会话。

但是与BasicHttpBinding不同,NetTcpBinding和NetNamedPipeBinding具有内在的可靠传递和基于连接的会话支持,所以这两个绑定受上述两点的影响非常小。

好了就说到这儿,有些地方比较生硬,对那些跟我一样在WCF方面是新手而又看了这篇文章的朋友说声对不起,其实我看徐长龙的这一系列教程,是为了方便我都读《WCF服务编程》《WCF技术内幕》这两本书。

WCF基础之大型数据和流的更多相关文章

  1. WCF 基础框架

    WCF 基础框架: 1,契约:契约书一语个服务公共接口的一部分,一个服务的契约定义了服务端公开的方法,使用的传递协议,可访问的地址,传输的消息格式等内容,主要包括数据契约,消息契约,服务契约等. 2, ...

  2. WCF服务编程 读书笔记——第1章 WCF基础(2)

    续:第1章 WCF基础(1) 元数据交换 服务有两种方案可以发布自己的元数据.一种是基于HTTP-GET协议提供元数据, 另一种则是后面将要讨论的使用专门的终结点的方式.WCF能够为服务自动提供基于H ...

  3. WCF服务编程 读书笔记——第1章 WCF基础(1)

    第1章 WCF基础 本章主要介绍WCF的基本概念.构建模块以及WCF体系架构,以指导读者构建一个简单的WCF服务.从本章的内容中,我们可以了解到WCF的基本术语,包括地址(Address).绑定(Bi ...

  4. TWaver 3D应用于大型数据中心(续)

    在2014年11月份,我们当时发了一篇有关TWaver HTML5 3D应用于大型数据中心的文章,该blog比较详细的描述一些常用的功能的实现方法,比如:动态添加机柜,告警,温度,湿度等相关的功能的具 ...

  5. IO流总结---- 字节流 ,字符流, 序列化 ,数据操作流,打印流 , Properties 集合

    笔记内容: 什么是流 字节流 字符流 序列化 数据操作流(操作基本数据类型的流)DataInputStream 打印流 Properties 集合 什么是流: 流是个抽象的概念,是对输入输出设备的抽象 ...

  6. Java 基础(四)| IO 流之使用文件流的正确姿势

    为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是 IO 流? 想象一个场景 ...

  7. WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?

    在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...

  8. 2015年12月28日 Java基础系列(六)流

    2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流

  9. 【读书笔记《Android游戏编程之从零开始》】20.游戏开发基础(游戏数据存储)

    对于数据的存储,Android 提供了4种保存方式. (1)SharedPreference 此方法适用于简单数据的保持,文如其名,属于配置性质的保存,不适合比较大的情况,默认存放在手机内存里 (2) ...

随机推荐

  1. vertex buffer 数据结构 如何读vb的memory pool

    vertex attribute (declaration)    vertex stream (memory pool) 这两部分 通过attribute 里面对memory的描述把两部分 vbo ...

  2. python项目构建工具zc.buildout

    转载:http://blog.csdn.net/u011630575/article/details/52940099 buildout简介 Buildout 是一个基于Python的构建工具, Bu ...

  3. python 处理抓取网页乱码问题一招鲜

    FROM: http://my.oschina.net/012345678/blog/122355 相信用python的人一定在抓取网页时,被编码问题弄晕过一阵 前几天写了一个测试网页的小脚本,并查找 ...

  4. 配置php扩展memcache

    配置php扩展memcache 环境说明: 系统版本    CentOS 6.9 x86_64         软件版本    nginx-1.12.2        php-5.5.38       ...

  5. C++003基础

    1.C++对C的扩展 1简单的C++程序 1.1求圆的周长和面积 数据描写叙述: 半径.周长,面积均用实型数表示 数据处理: 输入半径 r. 计算周长 = 2*π*r : 计算面积 = π* r2 . ...

  6. RabbitMQ二----' helllo world '

    RabbitMQ实现了AMQP定义的消息队列.它实现的功能”非常简单“:从Producer接收数据然后传递到Consumer.它能保证多并发,数据安全传递,可扩展. 我们将会设计两个程序,一个发送He ...

  7. Recycling Settings for an Application Pool <recycling>

    Overview The <recycling> element contains configuration settings that control the conditions t ...

  8. STL学习笔记(关联式容器)

    Set和Multisets set和multiset会根据特定的排序准则,自动将元素排序.两者不同在于multisets允许元素重复而set不允许. 1.set和multiset的操作函数 生成.复制 ...

  9. xcode 项目证书跟签名都正确的时候,还报证书错误

    原因,安装证书错误,导致无法匹配证书, 方案:删除原来的证书,重新安装 打开终端 1.cd Library/ 2.cd MobileDevice/ 3.open Provisioning\ Profi ...

  10. PHP面试题及答案解析(7)—Linux系统命令

    1.请解释下列10个shell命令的用途.top.ps.mv.find.df.cat.chmod.chgrp.grep.wc top:该命令提供了实时对系统处理器状态的监控,它能够实时显示系统中各个进 ...