在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. Jsp中如何在<c:forEach>标签内获取集合的长度

    利用jstl标签functions的prefix属性的length属性值 1.首先在jsp页面导入jstl function标签 <%@ taglib prefix="fn" ...

  2. ES6里的修饰器Decorator

    修饰器(Decorator)是一个函数,用来修改类的行为. 一.概述 ES6 引入了这项功能,目前 Babel 转码器已经支持Decorator 首先,安装babel-core和babel-plugi ...

  3. [转载]java自带线程池和队列详细讲解

    FROM:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中 ...

  4. zabbix监控php-fpm

    1.启用php-fpm的状态功能 [root@web01 ~]# vim /etc/php-fpm.d/www.conf 121 pm.status_path = /php_status [root@ ...

  5. Json序列化为对象方法

    /// <summary>/// json 序列化为对象/// </summary>/// <typeparam name="T">对象类型&l ...

  6. GROUP BY和HAVING 以及mysql中常用的日期函数

    一.mysql中的GROUP BY和HAVINGGROUP BY常见的是和聚合函数(SUM,MIN,MAX,COUNT)搭配使用. 比如:SELECT category,SUM(money) AS ` ...

  7. vuejs 表单验证插件 VeeValidate

    VeeValidate https://baianat.github.io/vee-validate/

  8. Nginx 简单的负载均衡配置演示样例

    近期在做开放查询应用的时候,因为数据两天特别多,两千多万条呢,用户訪问需求也比較大,所以就用nginx做了 负载均衡,以下是改动之后的相关内容. http://www.cnblogs.com/xiao ...

  9. 【Excle数据透视表】如何将行字段中的某个项目拖动到第一行显示

    如下图:需要把上海放到第一显示 步骤 方法一: 单击"地区"下的"上海"→鼠标移动到单元格边框处→鼠标变成四向箭头→向上拖拽 方法二: 单击单元格A5→编辑区域 ...

  10. .aspx 页面引用命名空间

    一.单个页面引用: <%@ Import Namespace="" %> 二.所有页面引用,Web.config配置如下: <system.web> < ...