WCF中的Stream操作

WCF Tips之三

WCF支持对Stream对象的操作,尤其对于传递size过大 的消息而言,如要考虑传递消息的效率,WCF推荐通过Stream进行操作。

然而,WCF对于Stream操作规定了一些限制,在我们编写相关程序时,需要特别 注意:

1、绑定的限制

如果需要使用Stream操作,可以使用的绑 定只能是BasicHttpBinding,NetTcpBinding以及NetNamedPipeBinding。此外, 在使用Stream操作时,不能使用Reliable Messaging。如果考虑到消息安全,则 此方式是不可取的。

2、对Stream对象的限制

要作为服务操作所 传递的消息对象,这样的对象必须是可序列化的。遗憾的是,FileStream类的定 义却是不支持序列化的,我们能够使用的Stream对象,包括Stream, MemoryStream等。使用Stream类对象是大多数Stream操作的首选。

一个 有趣的现象是FileStream与Stream类型的转换。例如在服务契约的操作中,有如 下的实现:

public Stream TransferDocument(Document document){     FileStream stream = new FileStream                             (document.LocalPath, FileMode.Open, FileAccess.Read);     return stream;}

注意,操作TransferDocument()的 返回类型为Stream,而方法的实现中,返回的对象则为FileStream类型。由于 Stream类是FileStream类的父类,这样的实现没有问题。

然而,在客户 端调用该操作时,却不能将操作的返回值赋给FileStream类型的对象,如下所示 :

FileStream stream=m_service.TransferDocument(doc);

此时 获得的Stream对象则为null。因而,我们只能这样调用操作:

Stream stream=m_service.TransferDocument(doc);

但是,还有 一个奇怪的问题是WCF并不支持Stream对象Length属性的序列化,也就是说,在 客户端我们不能使用服务操作返回的Stream对象的Length属性。诸如 stream.Length的调用会抛出NotSupportedException异常。

3、 TransferMode的限制

若要使用Stream操作,必须修改绑定的 TransferMode属性。该属性的默认值为Buffered。我们应该根据操作中Stream对 象的参数类型,以决定TransferMode的值分别为Streamed、StreamedRequest或 者StreamedResponse。

4、MaxReceivedMessageSize的限制

MaxReceivedMessageSize属性的默认值为64kb,如果传递的Stream对象 一旦超过了MaxReceivedMessageSize属性的设置值,则客户端在操作该对象时, 就会出现CommunicationException异常。因此,我们应根据实际需要设置 MaxReceivedMessageSize的值。MaxReceivedMessageSize属性的取值范围为1- 9223372036854775807(Int32.MaxValue)。如果设置值不在该范围之内,则无 法通过编译。编程方式设置为:

binding.MaxReceivedMessageSize = 120000;

配置文件的设置方式为:

<binding…… maxReceivedMessageSize="120000"/>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, spark streaming问题
, 属性
, 类型
, stream
, filestream
, otl stream
限制
wcf stream、wcf操作xml、wcf操作xml文件、wcf教程 数据安全操作、wcf操作数据库,以便于您获取更多的相关知识。

时间: 2024-09-28 21:24:54

WCF中的Stream操作的相关文章

在 WCF 中使用高效的 BinaryFormatter 序列化

本文将定义一个 WCF 终结点行为扩展,以在 WCF 中使用更高效的 BinaryFormatter 进行二进制序列化,并实现对是否使用传统二进制序列化功能的可配置. 介绍 实现步骤 使用方法 效果   介绍 在 OEA 框架中,是使用 WCF 作为数据传输框架.但是使用 WCF 内部的二进制序列化,序列化后的数据大小,要比使用传统的 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 类进行序列化后的数据大小要大得多.作

我的WCF之旅(4):WCF中的序列化(Serialization)- Part I

SOA 和Message Windows Communication Foundation (WCF) 是基于面向服务架构(Service Orientation Architecture--SOA)的一种理想的分布式技术(Distributed Technology), 相信在今后在建立基于SOA企业级别的解决方案和进行系统集成方面将会大有作为.一个基于SOA结构的互联系统(Connected System)通常由若干相互独立的子系统(Sub-System)组成,这些子系统可能一个独立的App

WCF中的Binding模型之六(完结篇):从绑定元素认识系统预定义绑定

由于绑定对象由一系列有序的绑定元素组成,绑定元素最终决定着信道栈中信道的组成,而信道的组成最终又决定了信道栈对消息进行处理的方式和能力,所有要确定绑定的特性和能力,我们可以通过查看其绑定元素的构成来一窥究竟.为此我们我们写了一个简单的方法,用于列出一个具体的绑定对象所有的绑定元素,在介绍一个个具体的系统绑定中,我会使用该方法: 1: static void ListAllBindingElements(Binding binding) 2: { 3: BindingElementCollecti

我的WCF之旅(4):WCF中的序列化[上篇]

SOA 和Message Windows Communication Foundation (WCF) 是基于面向服务架构(Service Orientation Architecture--SOA)的一种理想的分布式技术(Distributed Technology), 相信在今后在建立基于SOA企业级别的解决方案和进行系统集成方面将会大有作为.一个基于SOA结构的互联系统(Connected System)通常由若干相互独立的子系统(Sub-System)组成,这些子系统可能一个独立的App

[WCF中的Binding模型]之六(完结篇):从绑定元素认识系统预定义绑定

由于绑定对象由一系列有序的绑定元素组成,绑定元素最终决定着信道栈中信道的组成,而信道的组成最终又决定了信道栈对消息进行处理的方式和能力,所有要确定绑定的特性和能力,我们可以通过查看其绑定元素的构成来一窥究竟.为此我们我们写了一个简单的方法,用于列出一个具体的绑定对象所有的绑定元素,在介绍一个个具体的系统绑定中,我会使用该方法: static void ListAllBindingElements(Binding binding) { BindingElementCollection elemen

艾伟:[WCF中的Binding模型]之六(完结篇):从绑定元素认识系统预定义绑定

由于绑定对象由一系列有序的绑定元素组成,绑定元素最终决定着信道栈中信道的组成,而信道的组成最终又决定了信道栈对消息进行处理的方式和能力,所有要确定绑定的特性和能力,我们可以通过查看其绑定元素的构成来一窥究竟.为此我们我们写了一个简单的方法,用于列出一个具体的绑定对象所有的绑定元素,在介绍一个个具体的系统绑定中,我会使用该方法: static void ListAllBindingElements(Binding binding){ BindingElementCollection element

WCF技术剖析之十一:异步操作在WCF中的应用(下篇)

说完了客户端的异步服务调用(参阅WCF技术剖析之十一:异步操作在WCF中的应用(上篇)),我们在来谈谈服务端如何通过异步的方式为服务提供实现.在定义服务契约的时候,相信大家已经注意到了OperationContractAttribute特性具有一个bool类型的AsynPattern.该属性可以将一个服务操作定义成异步实现模式,接下来的内容主要是着眼于介绍异步操作的定义和实现原理. 一.异步操作的定义和实现原理 实现WCF异步服务操作模式在编程上具有一些限制:异步服务操作是通过两个配对的方法实现

WCF技术剖析之十一:异步操作在WCF中的应用(上篇)

按照操作执行所需的资源类型,我们可以将操作分为CPU绑定型(CPU Bound)操作和I/O绑定型(I/O Bound)操作.对于前者,操作的执行主要利用CPU进行密集的计算,而对于后者,大部分的操作处理时间花在I/O操作处理,比如访问数据库.文件系统.网络资源等.对于I/O绑定型操作,我们可以充分利用多线程的机制,让多个操作在自己的线程并发执行,从而提高系统性能和响应能力.服务调用就是典型的I/O绑定型操作,所以多线程在服务调用中具有广泛的应用.在本篇文章中,我们专门来讨论多线程或者是异步操作

WCF中的REST架构二 (支持AJAX的WCF服务

我在昨天的文章WCF中的REST架构一(REST 概述)谈了REST的基本概要,并提出了从HI REST (高REST)到 LO REST (低REST) 的RESTFULness(REST度)的概念.在今天的文章中,我将详细介绍大家可能最为熟悉的REST风格的WCF 服务:支持AJAX的服务.此类服务应属于LO REST的范畴.现在很多人直觉地将"好"等同于"高大全",因而低估了这种LO REST实现的价值.本篇将告诉你这决非事实,支持AJAX的WCF服务是足够强