本文的出發點:
通過閱讀本文,能解決以下的問題
什麼是契約?
契約有幾種?,他們都有什麼用途
如何定義契約?
契約是獨立於平台的麼?
契約和以往哪種技術比較相像,又有什麼不同?
本文適合的讀者
wcf的初學者,可以沒有任何soa或者其他分布式技術經驗
什麼是契約?
任何乙個分布式應用程式,它之所以能夠互相傳遞訊息,都是事先制定好資料交換規則的,這個規則正是交換資料的雙方(比如伺服器端和客戶端)能彼此理解對方的依據,wcf作為分布式開發技術的一種,同樣具有這樣一種特性。而在wcf中制定的的規則就被稱之為契約(contract),它是wcf的訊息標準,是任何乙個wcf程式不可或缺的一部分。
契約有幾種?,他們都有什麼用途
在wcf中,契約分為四種,它們分別為:
用於定義服務操作的服務契約:service contract
這種級別的契約又包括兩種:servicecontract和operationcontract
servicecontract用於類或者結構上,用於指示wcf此類或者結構能夠被遠端呼叫,而operationcontract用於類中的方法(method)上,用於指示wcf該方法可被遠端呼叫。
用於自定義資料結構的資料契約:data contract
資料契約也分為兩種:datacontract和datamember.datacontract用於類或者結構上,指示 wcf此類或者結構能夠被序列化並傳輸,而datamember只能用在類或者結構的屬性(property)或者字段(field)上,指示wcf該屬性或者字段能夠被序列化傳輸。
用於自定錯誤異常的異常契約:fault contract
faultcontract用於自定義錯誤異常的處理方式,預設情況下,當服務端丟擲異常的時候,客戶端能接收到異常資訊的描述,但這些描述往往格式統一,有時比較難以從中獲取有用的資訊,此時,我們可以自定義異常訊息的格式,將我們關心的訊息放到錯誤訊息中傳遞給客戶端,此時需要在方法上新增自定義乙個錯誤訊息的類,然後在要處理異常的函式上加上faultcontract,並將異常資訊指示返回為自定義格式。
用於控制訊息格式的訊息契約:message contract
簡單的說,它能自定義訊息格式,包括訊息頭,訊息體,還能指示是否對訊息內容進行加密和簽名。
如何定義契約?
其實上面落裡羅嗦說了一大堆,似乎契約使用起來應該很難的樣子了,可事實上,契約的使用是很簡單的,它無非就是在普通的程式結構上新增一些宣告性的屬性就可以了,比如我們可以直接在類上宣告servercontractattribute,此時這個類就能被遠端客戶端訪問到,而在類中的方法中(method)新增operationcontractattribute就能將方法暴露給遠端客戶端,其他的契約也一樣的用法,比較難得還是訊息契約和錯誤契約,當也很簡單。我這裡沒有wcf開發環境,所以具體怎麼用,我就不做示例了,您仍不明白的話,可以參考下面幾篇文章:
他們的blog中都有較詳細的闡述和使用方法說明
契約是獨立於平台的麼?
契約和以往哪種技術比較相像,又有什麼不同?
如果非要拿契約和以往的技術相比較的話,契約和asp.net xml web service的宣告性程式設計模型甚是相似,比如在web service中在類上標記webserviceattribute便可以將此類用於遠端呼叫,而將方法新增webmethondattribute也可以將其暴露給遠端客戶端,這和wcf中的servicecontract和operationcontract簡直如出一轍,但不同的是,wcf中的契約要比xml web service中的要詳盡的多,比如servicecontract和operationcontract可以直接使用在介面上面,而實現該介面的類就繼承了這種契約宣告,自動擁有契約所規範的動作和行為,這就使得程式設計師更方便的使用面向介面的程式設計方式,可以使同一服務擁有不同的實現,在新舊版本公升級的同時,能夠使新老版本共同執行。
本文的參考資料
有關WCF的契約問題
wcf中的契約包括4種 資料契約 datacontract datamember 服務契約 servicecontract operactioncontract 訊息契約 messagecontract 異常契約 faultcontract 用於定義服務操作的服務wcf契約 service cont...
WCF中的資料契約和服務契約
1 服務契約定義了遠端訪問物件和可供呼叫的方法 servicecontract特性允許應用到介面或類上。當介面應用了servicecontract特性後,需要定義類實現該介面 然後使用乙個或多個類 或介面 方法中的 operationcontract 屬性定義協定的服務操作 通俗的說,給乙個類或者是...
WCF中的資料契約(DataContract)
服務契約定義了遠端訪問物件和可供呼叫的方法,資料契約則是服務端和客戶端之間要傳送的自定義資料型別。一旦宣告乙個型別為datacontract,那麼該型別就可以被序列化在服務端和客戶端之間傳送,如下所示。datacontract public class userinfo 只有宣告為datacontr...