WCF支持Stream操做,尤爲對於傳遞size過大的消息而言,如要考慮傳遞消息的效率,WCF推薦經過Stream進行操做。然而,WCF Stream操做規定了一些限制,在咱們編寫相關程序時,須要特別注意:html
一、綁定的限制編程
若是須要使用Stream操做,可使用的綁定只能是BasicHttpBinding,NetTcpBinding以及NetNamedPipeBinding。此外,在使用Stream操做時,不能使用Reliable Messaging。若是考慮到消息安全,則此方式是不可取的。安全
二、對Stream對象的限制htm
要做爲服務操做所傳遞的消息對象,這樣的對象必須是可序列化的。遺憾的是,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類的父類,這樣的實現沒有問題。ip
然而,在客戶端調用該操做時,卻不能將操做的返回值賦給FileStream類型的對象,以下所示:utf-8
FileStream stream = m_service.TransferDocument(doc); 此時得到的Stream對象則爲null。於是,咱們只能這樣調用操做:it
Stream stream = m_service.TransferDocument(doc); 可是,還有一個奇怪的問題是WCF並不支持Stream對象Length屬性的序列化,也就是說,在客戶端咱們不能使用服務操做返回的Stream對象的 Length屬性。諸如stream.Length的調用會拋出NotSupportedException異常。io
三、TransferMode的限制編譯
若要使用Stream操做,必須修改綁定的TransferMode屬性。該屬性的默認值爲Buffered。咱們應該根據操做中WCF Stream對象的參數類型,以決定TransferMode的值分別爲Streamed、StreamedRequest或者StreamedResponse。
四、MaxReceivedMessageSize的限制
MaxReceivedMessageSize屬性的默認值爲64kb,若是傳遞的Stream對象一旦超過了 MaxReceivedMessageSize屬性的設置值,則客戶端在操做該對象時,就會出現CommunicationException異常。所以,咱們應根據實際須要設置MaxReceivedMessageSize的值。MaxReceivedMessageSize屬性的取值範圍爲 1-9223372036854775807(Int32.MaxValue)。若是設置值不在該範圍以內,則沒法經過編譯。編程方式設置爲:
<binding …… maxReceivedMessageSize="120000"/> 五、操做參數的限制
WCF Stream操做參數嚴格的限制,它只容許這樣的操做只能包含一個Stream對象,這裏所謂的一個WCF Stream對象,是包含return對象,out和ref對象在內的。也就是說以下的操做定義都是錯誤的:
void Transfer(Stream s1, Stream s2); void Transfer(Stream s1, out Stream s2); void Transfer(Stream s1, ref Stream s2); Stream Transfer(Stream stream); 若是定義了這樣的操做,則會出現運行時錯誤。
此外,因爲傳輸的WCF Stream對象較大,可能會消耗過長的時間,於是建議增大綁定的SendTimeout屬性值。例如設置爲10分鐘。編程方式設置爲:
binding.SendTimeout = TimeSpan.FromMinutes(10); 配置文件的設置方式爲:
<binding …… sendTimeout="00:10:00"/> 注意,對綁定的相關設置必需要求服務端與客戶端的配置一致。最佳實踐是均經過配置文件進行設置。例如在個人應用程序中是這樣設置的:
<basicHttpBinding> <binding name="DocumentExplorerServiceBinding" sendTimeout="00:10:00" transferMode="Streamed" messageEncoding="Text" textEncoding="utf-8" maxReceivedMessageSize="9223372036854775807"> </binding> </basicHttpBinding>
轉自:http://www.bitscn.com/pdb/dotnet/201003/181984.html