在默認狀況下,當客戶端調用服務時,服務只有在接收到完整的消息後纔會被調用,一樣,客戶端只有在包含了調用結果的返回消息被完整接受時,纔會解除對它的阻塞。編程
對於數據量小的消息,這種交換模式提供了簡單的編程模型,由於接收消息的耗時較之處理消息自己而言是微不足道的。然而,一旦須要處理數據量較大的消息,如包含了多媒體內容、大文本或數據塊的消息,若是每次都要等到完整接收消息以後才能解除阻塞,則未免不太現實。緩存
爲了解決這樣的問題,WCF容許接收到(客戶端或服務)在經過通道接收消息的同時,啓動對消息數據的處理。這種類型的處理過程稱爲流傳輸模型。對於具備大量負載的消息而言,流操做改善了系統的吞吐量和響應速度,由於在發送 或接收消息的同時,不論是發送方仍是接收方都不會被阻塞。安全
若要處理消息流,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
只有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>
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綁定執行流操做時,一樣不能啓用可靠消息傳輸。
示例下載:下載