熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

談談WCF Stream對象限制操作

2022-06-13   來源: .NET編程 

  WCF支持Stream操作尤其對於傳遞size過大的消息而言如要考慮傳遞消息的效率WCF推薦通過Stream進行操作然而WCF Stream操作規定了一些限制在我們編寫相關程序時需要特別注意

  綁定的限制

  如果需要使用Stream操作可以使用的綁定只能是BasicHttpBindingNetTcpBinding以及NetNamedPipeBinding此外在使用Stream操作時不能使用Reliable Messaging如果考慮到消息安全則此方式是不可取的

  對Stream對象的限制

  要作為服務操作所傳遞的消息對象這樣的對象必須是可序列化的遺憾的是FileStream類的定義卻是不支持序列化的我們能夠使用的Stream 對象包括StreamMemoryStream等使用Stream類對象是大多數Stream操作的首選一個有趣的現象是FileStream與Stream類型的轉換例如在服務契約的操作中有如下的實現

  public Stream TransferDocument(Document document) { FileStream stream = new FileStream (documentLocalPath FileModeOpen FileAccessRead); return stream; } 注意操作TransferDocument()的返回類型為Stream而方法的實現中返回的對象則為FileStream類型由於Stream類是FileStream類的父類這樣的實現沒有問題

  然而在客戶端調用該操作時卻不能將操作的返回值賦給FileStream類型的對象如下所示

  FileStream stream = m_serviceTransferDocument(doc); 此時獲得的Stream對象則為null因而我們只能這樣調用操作

  Stream stream = m_serviceTransferDocument(doc); 但是還有一個奇怪的問題是WCF並不支持Stream對象Length屬性的序列化也就是說在客戶端我們不能使用服務操作返回的Stream對象的 Length屬性諸如streamLength的調用會拋出NotSupportedException異常

  TransferMode的限制

  若要使用Stream操作必須修改綁定的TransferMode屬性該屬性的默認值為Buffered我們應該根據操作中WCF Stream對象的參數類型以決定TransferMode的值分別為StreamedStreamedRequest或者StreamedResponse

  MaxReceivedMessageSize的限制

  MaxReceivedMessageSize屬性的默認值為kb如果傳遞的Stream對象一旦超過了 MaxReceivedMessageSize屬性的設置值則客戶端在操作該對象時就會出現CommunicationException異常因此我們應根據實際需要設置MaxReceivedMessageSize的值MaxReceivedMessageSize屬性的取值范圍為 (IntMaxValue)如果設置值不在該范圍之內則無法通過編譯編程方式設置為

  <binding …… maxReceivedMessageSize=/> 操作參數的限制

  WCF Stream操作參數嚴格的限制它只允許這樣的操作只能包含一個Stream對象這裡所謂的一個WCF Stream對象是包含return對象out和ref對象在內的也就是說如下的操作定義都是錯誤的

  void Transfer(Stream s Stream s); void Transfer(Stream s out Stream s); void Transfer(Stream s ref Stream s); Stream Transfer(Stream stream); 如果定義了這樣的操作則會出現運行時錯誤

  此外由於傳輸的WCF Stream對象較大可能會消耗過長的時間因而建議增大綁定的SendTimeout屬性值例如設置為分鐘編程方式設置為

  bindingSendTimeout = TimeSpanFromMinutes(); 配置文件的設置方式為

  <binding …… sendTimeout=::/> 注意對綁定的相關設置必須要求服務端與客戶端的配置一致最佳實踐是均通過配置文件進行設置例如在我的應用程序中是這樣設置的

  <basicHttpBinding> <binding name=DocumentExplorerServiceBinding sendTimeout=:: transferMode=Streamed messageEncoding=Text textEncoding=utf maxReceivedMessageSize=> </binding> </basicHttpBinding>


From:http://tw.wingwit.com/Article/program/net/201311/12235.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.