[WCF编程]10.操作:流操作
一、流操作概述
在默认情况下,当客户端调用服务时,服务只有在接收到完整的消息后才会被调用,同样,客户端只有在包含了调用结果的返回消息被完整接受时,才会解除对它的阻塞。
对于数据量小的消息,这种交换模式提供了简单的编程模型,因为接收消息的耗时较之处理消息本身而言是微不足道的。然而,一旦需要处理数据量较大的消息,如包含了多媒体内容、大文本或数据块的消息,如果每次都要等到完整接收消息之后才能解除阻塞,则未免不太现实。
为了解决这样的问题,WCF允许接收到(客户端或服务)在通过通道接收消息的同时,启动对消息数据的处理。这种类型的处理过程称为流传输模型。对于具有大量负载的消息而言,流操作改善了系统的吞吐量和响应速度,因为在发送 或接收消息的同时,不管是发送方还是接收方都不会被阻塞。
二、I/O流
若要处理消息流,WCF需要使用.NET的Stream类。事实上,契约操作对流的使用看起来和传统的I/O方法并无区别。在.NET中,Stream类是所有I/O的基类(如FileStream、NetworkStream和MemoryStream类),它允许将I/O资源中的内容转化为流。我们需要做的就是返回或接收一个Stream类型的操作参数,如下例所示:
[ServiceContract]
interface IMyContract
{
[OperationContract]
System.IO.Stream StreamReply1();[OperationContract]
System.IO.Stream StreamReply2(</span><span style="color: #0000ff">out</span><span style="color: #000000"> System.IO.Stream stream); [OperationContract]
</span><span style="color: #0000ff">void</span><span style="color: #000000"> StreamRequest(System.IO.Stream stream); [OperationContract(IsOneWay </span>= <span style="color: #0000ff">true</span><span style="color: #000000">)]
</span><span style="color: #0000ff">void</span><span style="color: #000000"> OneWayStream(System.IO.Stream stream);
}</span></pre></div>
注意,只能将抽象类型Stream类型或特定的可序列化的子类(如MemoryStream)作为操作参数。诸如FileStream这样的子类都不支持序列化,因为使用基类Stream其实是无奈之举。
WCF允许服务将请求消息、应答消息,以及请求与应答消息转换为流。
三、流操作与绑定
只有TCP、IPC和基本的HTTP绑定支持流操作。在默认的情况下,这些绑定是禁止流操作的。即使使用了Stream对象,绑定仍然会将消息整体放到缓存中。我们需要根据所需的流模式,通过设置TrasferMode属性启用流操作,例如,以下使用BasicHttpBingding时。
public enum TransferMode
{
//对请求和响应消息进行缓冲处理
Buffered,
//对请求和响应消息进行流式处理
Streamed,
//对请求消息进行流式处理,对响应消息进行缓冲处理
StreamedRequest,
//对请求消息进行缓冲处理,对响应消息进行流式处理
StreamedResponse
} public class BasicHttpBingding:Bingding
{
public TransferMode TransferMode{get;set}
.......
}TransferMode.Streamed支持所有的流模式,也是唯一支持第二节例子中定义的所有操作。但是,如果契约只包含特定的流类型,如以下转换为流的应答消息,则可以包含一个设置为buffered的请求消息,也可以通过选择TransferMode.StreamedResponse将消息转化为流:
[ServiceContract]
interface IMyConttract
{
//流的应答消息
[OperationContract]
Stream GetStream1();
[OperationContract]
int MyMethod();
}在客户端或服务段(或同时在两端),必须为每个所需的流模式配置绑定。
<system.serviceModel>
<client>
<endpoint
address = "http://localhost:8000/MediaService"
binding = "basicHttpBinding"
bindingConfiguration = "StreamedHTTP"
contract = "IMediaService"
/>
</client>
<bindings>
<basicHttpBinding>
<binding name = "StreamedHTTP" transferMode="Streamed">
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>四、流操作与传输
WCF的流操作只不过是一种良好的编程模型。从根本上讲,传输自身并不支持流操作,它默认的最大消息长度为64KB。这样的数据可能存在问题时,开发者可能希望使用流操作,转换为流的消息往往会非常大。如果默认的限制不够大,开发者可以增加接收端消息的最大长度,以适应大数据量的消息。可以通过MaxReceivedMessageSize属性,以获得期望的最大消息长度。
public class BasicHttpBingding:Bingding,...
{
public long MaxReceivedMessageSize{get;set;}
}可以在运行时采用反复试验找出消息的大小,然后设置相应的绑定。
通常,我们应避免使用编程方式,而是将一段配信息放到配置文件中,因为消息大小的改变通常发生在部署阶段:
<bindings>
<basicHttpBinding>
<binding name = "StreamedHTTP" transferMode="Streamed" maxReceivedMessageSize ="120000">
</binding>
</basicHttpBinding>
</bindings>当使用流操作时,不能使用消息层的传输安全。这是因为TCP、IPC和基本的HTTP绑定支持流操作,对于这些绑定,通常不能使用消息安全。在使用TCP绑定执行流操作时,同样不能启用可靠消息传输。
示例下载:下载
[WCF编程]10.操作:流操作的更多相关文章
- [WCF编程]10.操作:请求/应答操作
一.调用操作概述 WCF除了支持经典的服务端-客户端的请求/应答操作外,还提供了对其他操作类型的内建支持,包括:即发即弃的单向调用:允许服务将调用返回给客户端的双向回调:允许客户端或服务器处理大量负荷 ...
- [WCF编程]10.操作:回调操作
一.回调操作概述 WCF支持服务将调用返回给它的客户端.在回调期间,许多方面都将颠倒过来:服务将成为客户端,客户端将编程服务.回调操作可以用在各种场景和应用程序中,但在涉及事件或者服务发生时间需要通知 ...
- [WCF编程]10.操作:单向操作
一.单向操作概述 WCF提供了单向操作,一旦客户端调用,WCF会生成一个请求,但没有相关的应答信息返回给客户端.所以,单向操作是不能有返回值,服务抛出的任何异常都不会传递给客户端. 理想情况下,一旦客 ...
- java网络编程TCP传输—流操作—服务端反馈与客户端接收
在读取完流后,服务端会向客户端返回一些数据,告诉客户端,已经写完了. 在这里和”流操作—拿到源后的写入动作“差不多,客户端同样以byte与Buffered两种缓冲读取作为例子,同时,.也是希望大家给补 ...
- [WCF编程]10.操作:事件
一.事件概述 基础的WCF回调机制并不能阐明客户端与服务之间交互的本质.双向回调的规范使用可以通过事件来完成.客户端发生的相关事项都可以通过事件通知客户端或者多个客户端.事件可能源于直接的客户端调用, ...
- C++文件编程(文件流操作)
给出了比较常见的文件操作,包括二进制文件操作.代码如下: #include<iostream> #include<cstdio> #include<cstring> ...
- java网络编程TCP传输—流操作—拿到源后的写入动作
在网络编程中的TCP传输里,拿到Socket的源后,应该怎么进行读写操作呢,下面我列举了两种方法,希望大家帮忙补充···· 1.利用byte数组作为一个缓冲区进行读写 客户端上传 //获取socket ...
- -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流
File类 •文件和目录路径名的抽象表示形式 构造方法 •public File(String pathname) •public File(String parent,Stringchild) ...
- Storm实时计算:流操作入门编程实践
转自:http://shiyanjun.cn/archives/977.html Storm实时计算:流操作入门编程实践 Storm是一个分布式是实时计算系统,它设计了一种对流和计算的抽象,概念比 ...
随机推荐
- Linux2 在Linux(CentOS)上配置SSH免登陆
前言: 本文主要是我在安装hadoop之前,需要先配置SSH免登陆.通过网上搜索,发现不少类似的资料,但多少都有些小问题,所以结合自己的实践,记录在此,作为参考.如果能帮助到其他人,自然是更 ...
- CI框架搭建
CI 框架等移植到不同等环境十分方便,只要改很少等配置: 1.修改config.php 文件(修改这一个文件就可以跑通了): $config['base_url'] = 'http://127.0.0 ...
- oracle数据库的安装、配置与无残留卸载
安装配置 :关闭专用网络防火墙 2 :以管理员身份运行安装文件 ——“setup.exe” 3 :设置口令 其中SYS 用户权限大于 SYSTEM 4 :先决条件检查,若验证成功,点击 ”下 ...
- Java针对数据库增删改查代码
package com.bank.abc; import java.beans.PropertyVetoException; import java.sql.Connection; import ja ...
- HTTP学习二:Web应用中的HTTP
1 HTTP连接 1.1 TCP连接对性能的影响 TCP三次握手如下图: 如上图,建立一次TCP连接要经过三个步骤.HTTP是建立在TCP之上的,因此TCP连接的性能直接影响HTTP的性能. TCP影 ...
- Sql Server系列:索引基础
1 索引概念 索引用于快速查找在某个列中某个特定值的行,不使用索引,数据库必须从第1条记录开始读完整个表,知道找出需要的行.表越大,查询数据所花费的时间越多.如果表中查询的列有索引,数据库能快速到达一 ...
- LINQ系列:C#中与LINQ相关特性
1. 匿名类型 通过关键字var定义匿名类型,编译器将根据运算符右侧表达式的值来发出一个强类型. 使用匿名类型时要遵守的一些基本规则: ◊ 匿名类型必须有一个初始化值,而且这个值不能是空值(null) ...
- Why Namespace? - 每天5分钟玩转 OpenStack(102)
上一节我们讨论了 Neutron 将虚拟 router 放置到 namespace 中实现了不同 subnet 之间的路由.今天探讨为什么要用 namespace 封装 router? 回顾一下前面的 ...
- EntityFramework之一对一关系(二)
前言 关于表关系园中文章也是数不胜收,但是个人觉得最难攻克的是一对一,对其配置并非无道理可循,只要掌握了原理方可,且听我娓娓道来! 共享主键关系 概念:就是两个表共享相同的主键值,也就是说一表的主键值 ...
- jQuery之ready源码分析
只要使用过jQuery的,想必对ready都不陌生,$(function(){})和$(document).ready(function(){})的使用更是习以为常. 要说到window.onload ...