[WCF編程]10.操做:流操做

1、流操做概述

    在默認狀況下,當客戶端調用服務時,服務只有在接收到完整的消息後纔會被調用,一樣,客戶端只有在包含了調用結果的返回消息被完整接受時,纔會解除對它的阻塞。編程

    對於數據量小的消息,這種交換模式提供了簡單的編程模型,由於接收消息的耗時較之處理消息自己而言是微不足道的。然而,一旦須要處理數據量較大的消息,如包含了多媒體內容、大文本或數據塊的消息,若是每次都要等到完整接收消息以後才能解除阻塞,則未免不太現實。緩存

    爲了解決這樣的問題,WCF容許接收到(客戶端或服務)在經過通道接收消息的同時,啓動對消息數據的處理。這種類型的處理過程稱爲流傳輸模型。對於具備大量負載的消息而言,流操做改善了系統的吞吐量和響應速度,由於在發送 或接收消息的同時,不論是發送方仍是接收方都不會被阻塞。安全

2、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(out System.IO.Stream stream);

        [OperationContract]
        void StreamRequest(System.IO.Stream stream);

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

    注意,只能將抽象類型Stream類型或特定的可序列化的子類(如MemoryStream)做爲操做參數。諸如FileStream這樣的子類都不支持序列化,由於使用基類Stream實際上是無奈之舉。spa

    WCF容許服務將請求消息、應答消息,以及請求與應答消息轉換爲流。code

3、流操做與綁定

    只有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將消息轉化爲流:blog

[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>

4、流操做與傳輸

    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綁定執行流操做時,一樣不能啓用可靠消息傳輸。

示例下載:下載

相關文章
相關標籤/搜索