WCF分布式开发步步为赢(11):WCF流处理(Streaming)机制

Posted on 2009-05-13 00:49 Frank Xu Lei 阅读(2287) 评论(27)   编辑 收藏 网摘 所属分类: WCF分布式开发步步为赢, SOA and EAI

   WSE3.0框架提供了数据优化传输机制,WSE3.0构建Web服务安全(4):MTOM消息传输优化和文件上传、下载 疑问里进行了介绍。WCF同样也提供了流操作来支持大数据对象的传输和处理优化机制,今天我们WCF分布式开发步步为赢系列的(4):使用流操作(Streaming Operations)优化传输。本节会详细介绍流操作的相关概念、编程实现过程,以及实际开发过程中需要主要的一些问题。本节结构:【1】流处理的概念【2】流处理的特点【3】示例代码分析【4】总结。最后上传本文的示例代码。

    Streaming,本文翻译为流处理(张逸兄翻译的Programming WCF Services一书里把这个机制翻译为“流操作”,不存在争议。我选择“流处理”一词的意思,只是想把这个Streaming词形象准确化,动名词,流化处理、流处理,翻译为流操作,初学者会误会认为这个是一个服务操作。因为Streaming只是WCF内建的一个机制。而不是操作。)

   我们首先来理解什么是Streaming流处理。

【1】Streaming流处理的概念:

    通常情况,客户端和服务端进行交互,传递消息,都是放到接收端的缓存里,待接收完毕后再进行处理。无论接收端是客户端还是服务端都是如此。

【1.1】要解决的问题:

     当客户端调用服务时,要阻塞客户单进程,直到消息发送完毕,服务端才开始处理数据,然后是返回处理完毕的结果给客户端,客户端接收完毕,才能解除阻塞。这样带来的问题是当消息传递的时间很短,相对处理时间可以忽略不计,不会影响系统服务的效率。但是要是消息数据很大,比如是图片或者多媒体对象。每次传输时间相对较大,这样接收端的等待时间过久,势必每次阻塞都会很长,进程无法继续执行。因而导致效率低下。

【1.2】Streaming流处理:

     Streaming流处理就是WCF提供的主要针对大量消息数据处理的一种优化机制。WCF允许接收端通过通道接受消息的同时,启动对消息数据的处理,这样的过程称为流传输模型。

【2】Streaming流处理的特点:

      显然对于处理大量的消息数据而言,流处理机制改善了系统的吞吐量和响应效率。

【2.1】流处理操作定义:

    WCF的流处理机制需要使用.NET FrameWork定义的Stream类(它是FileStream, NetworkStream, MemoryStream 的父类)。流处理适用一下场景:

[ServiceContract]
interface  IMyContract
{
   [OperationContract]
   Stream StreamReply1( );

   [OperationContract]
   
void  StreamReply2( out  Stream stream);

   [OperationContract]
   
void  StreamRequest(Stream stream);

   [OperationContract(IsOneWay 
=   true )]
   
void  OneWayStream(Stream stream);
}

  它可以做为返回数据、参数、输出参数的类型。当然也可以作为单调服务的操作参数。这里使用的参数必须是可序列化的,例如MemoryStream。而FileStream不支持序列化因而不能作为参数或者返回数据的类型。

【2.2】流处理与绑定协议:

    流处理机制在特定的绑定协议中才能使用,目前是BasicHttpBinding, NetTcpBinding, 和NetNamedPipeBinding 支持流处理模型。但是在默认情况下,WCF禁止流处理模式。

   流传输模式使用使用TransferMode进行配置,TransferMode为枚举类型,其定义如下:


    
public   enum  TransferMode
    {
        
//  Summary:
        
//      The request and response messages are both buffered.
        Buffered  =   0 ,
        
//
        
//  Summary:
        
//      The request and response messages are both streamed.
        Streamed  =   1 ,
        
//
        
//  Summary:
        
//      The request message is streamed and the response message is buffered.
        StreamedRequest  =   2 ,
        
//
        
//  Summary:
        
//      The request message is buffered and the response message is streamed.
        StreamedResponse  =   3 ,
    }

  只有Streamed模式支持2.1中列举的流处理模式场景。除了直接在服务上配置属性以外,我们还可以再服务的配置文件里定义流传输模式。代码如下:

       < basicHttpBinding >
        
< binding name = " basicHttpBinding "    receiveTimeout = " 10:10:10

你可能感兴趣的:(SOA,and,EAI,WCF分布式开发步步为赢,WCF分布式开发步步为赢,wcf,binding,stream,代码分析,测试,优化)