在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. JS或jQuery获取当前屏幕宽度

    Javascript: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.b ...

  2. Nginx常用Rewrite(伪静态规则)WordPress/PHPCMS/ECSHOP/ShopEX/SaBlog/Discuz/DiscuzX/PHPWind/Typecho/DEDECMS

    目前已收集Wordpress.Wordpress二级目录.PHPCMS.ECSHOP.ShopEX.SaBlog.Discuz.Discuz X.PHPWind.Typecho.DEDECMS: Wo ...

  3. 转: java web demo的示例

    http://quqtalk.iteye.com/blog/360699 从事Java开发已经两年了,但是由于工作的关系,对Java Web还是个freshman.今天做了一个Java Web的简单D ...

  4. Web项目中用mybatis配置多个数据库

    需要在项目中配置多个数据库(比如一个mysql,一个oracle)的时候,可按照如下方式配置 首先是第一个数据库的配置 <bean name="transactionManager&q ...

  5. JAVA Eclipse如何重新设置工作空间workspace

    窗口-首选项-常规-启动和关闭,勾选启动时提示工作空间,然后移除现有的工作空间,最好也勾选启动时刷新工作空间   重启之后就可以设置工作空间了  

  6. JAVA Eclipse如何修改Android程序名称

    Values中修改strings.xml中的app_name即可   注意他是连接到AndroidManifest.xml文件的  

  7. 借助backtrace和demangle实现异常类Exception

    C++的异常类是没有栈痕迹的,如果需要获取栈痕迹,需要使用以下函数: #include <execinfo.h> int backtrace(void **buffer, int size ...

  8. python——操作符重载(重要)

    类可以重载python的操作符   旧认识:__X__的名字 是系统定义的名字:是python特殊方法专用标识.   操作符重载使我们的对象与内置的一样.__X__的名字的方法是特殊的挂钩(hook) ...

  9. JVM源码分析之FinalReference完全解读

    Java对象引用体系除了强引用之外,出于对性能.可扩展性等方面考虑还特地实现了4种其他引用:SoftReference.WeakReference.PhantomReference.FinalRefe ...

  10. C语言结构体及函数传递数组參数演示样例

    注:makeSphere()函数返回Sphere结构体,main函数中.调用makeSphere()函数,传递的第一个參数为数组,传递的数组作为指针.