WCF繫結和行為在普通應用和SilverLight應用一些對比

sinodzh發表於2014-07-30

本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。

閱讀目錄

本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。

 

介紹

  WCF是構建和執行互聯絡統的一系列技術的總稱,它是建立在Web Service架構上的一個全新的通訊平臺。我們可以把它看成是.NET平臺上的新一代的Web Service。WCF的繫結和行為可以對提供的服務提供不同的通訊方式支援和其他方面的約束。

繫結

一:通道與通道棧

  通道棧裡可以定義很多通道,如:BasicHttpBinding,WSHttpBinding,NetTcpBinding 等。我們就從最常用到的BasicHttpBinding來進行分析。

  BasicHttpBinding類繼承於Binding。我們對主要用到的限定做下描述:

  Binding類中有OpenTimeout,SendTimeout,ReceiveTimeout,CloseTimeout4個時間的限定。服務宿主端和客戶端配置都起作用。

舉個場景,客戶端呼叫服務這個過程:首先是開啟服務通訊連線,這個過程可能會涉及到認證等過程,假如超過OpenTimeout的時間還沒開啟,就會觸發對應的異常;其次是傳送服務呼叫請求,然後服務宿主端收到請求,處理完,然後將結果反饋到客戶端,這整個過程都輸入客戶端的傳送過程,也就是這整個過程超過SendTimeout了,就會觸發對應的異常,最後是關閉服務通訊連線,同開啟服務通訊連線。

  BasicHttpBinding類中有MaxBufferPoolSize(524288),MaxBufferSize(65536),MaxReceivedMessageSize(65536),TransferMode,ReaderQuotas等這些擴充套件限制。

  其中MaxBufferSize和MaxBufferPoolSize是一對屬性,當TransferMode為Buffered的時候,MaxBufferSize必須和MaxBufferPoolSize一致。

  客戶端這些屬性的配置也應該和服務宿主的配置一致,當然也可以不一致,比如服務宿主這邊採用TransferMode為Buffered,客戶端採用TransferMode為Streamed。

  當我們定義的Binding的Name為空,則這個Binding為預設的Binding。

如圖:

二:行為:

本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。

  行為分為ServiceBehaviors,EndpointBehaviors。服務行為可以定義服務的一些行為模式,比如後設資料是否公開,是否開始服務除錯,資料序列化物件個數限制等。

  在普通的呼叫下,客戶端也有EndpointBehaviors配置項,但是在SilverLight中卻沒有,那麼很多行為在SilverLight該怎麼進行配置列?等下在表。

  ServiceBehaviors很重要的兩個配置項就是serviceMetadata和dataContractSerializer。serviceMetadata的httpGetEnabled項可以控制後設資料是否被公開。dataContractSerializer的maxItemsInObjectGraph項可以控制服務反饋的結果資料的可序列化物件個數(這裡不是多少個例項,而是所有屬性的加合),maxItemsInObjectGraph不僅可以放寬對某些大資料服務呼叫的限制,也可以對DDos攻擊的限制。

  如圖:

普通應用和SilverLight應用區別

一:通道限制

  普通應用和SilverLight應用都可以在客戶端進行對應的通道限制,只不過SliverLight的transferMode只有Buffered,StreamedResponse兩種,readerQuotas配置項也是沒有的。

二:行為限制

  很多普通應用和SilverLight應用需要獲取比較大的資料,資料中的物件多了,很可能會觸發maxItemsInObjectGraph超出的異常,這裡兩者的配置區別也很大。

  首先:服務宿主端的maxItemsInObjectGraph配置肯定是得有。

  其次:普通應用客戶端是要配置對應的endpointBehaviors 中的maxItemsInObjectGraph。

  然而:SilverLight應用客戶端則沒有endpointBehaviors這個配置項,那麼我們應該怎麼通過配置來處理列,找了很多資料,自己也試驗了很多次,其實不用管這個行為配置。只要服務端配置了就可以了。

如圖:

服務端:

本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。

普通客戶端:

本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。

相關文章