WCF 設計和實現服務協定(01)
作者:jiankunking 出處:http://blog.csdn.net/jiankunking
WCF 術語:
? 消息– 消息是一個獨立的數據單元,它可能由幾個部分組成,包含消息正文和消息頭。
? 服務
– 服務是一個構造。它公開一個或多個終結點。當中每一個終結點都公開一個或多個服務操作。
? 終結點
– 終結點是用來發送或接收消息(或執行這兩種操作)的構造。 終結點包含一個定義消息能夠發送到的目的地的位置(地址)、一個描寫敘述消息應怎樣發送的通信機制規範(綁定)以及對於能夠在該位置發送或接收(或兩者皆可)的一組消息的定義(服務協定)— 該定義還描寫敘述了能夠發送何種消息。
– WCF 服務作為一個終結點集合向外界公開。
小註:
WCF服務即在服務端為client提供一系列方法的集合。這些方法能夠是在一個類中的,也能夠是包含在不同類中的。終結點即是指這些類,即一系列方法的入口。
創建服務協定:?
? 類或接口都能夠定義服務協定
? 建議使用接口。由於接口能夠直接對服務協定建模
? 服務協定接口具有托管接口的全部長處:
– 服務協定接口能夠擴展不論什麽數量的其它服務協定接口。
– 一個類能夠通過實現服務協定接口來實現隨意數量的服務協定。
– 能夠通過更改接口實現來改動服務協定的實現。而讓服務協定保持不變。
– 能夠通過實現舊接口和新接口來確定服務的版本號。 老client連接到原始版本號。而新client則能夠連接到較新的版本號。
? 定義服務協定
– 在類或接口上使用 ServiceContractAttribute 屬性標記
? 定義服務操作
?– 在方法上使用 OperationContractAttribute 屬性對其進行標記
? 參數和返回值
– 每一個操作都有一個返回值和一個參數。即使它們為 void。
能夠使用局部方法將對對象的引用從一個對象傳遞到還有一個對象,但與局部方法不同的是,服務操作不會傳遞對對象的引用。 它們傳遞的僅僅是對象的副本。
– 這一點非常重要,這是由於參數或返回值中使用的每一個類型都必須是可序列化的,換言之,該類型的對象必須能夠轉換為字節流,並能夠從字節流轉換為對象。
– 默認情況下。基元類型是可序列化的。.NET Framework 中的非常多類型都是可序列化的。
創建服務協定 ?服務操作的消息模式
1、請求/答復模式
– 通過請求/答復模式。請求發送方(client應用程序)將接收與請求相關的答復。 這是默認的模式,由於它既支持傳入操作(一個或多個參數傳遞到該操作中?)。也?支持返回操作(該操作將一個或多個輸出值傳回給調用方)
[OperationContract] string Hello(string greeting);–請註意,除非指定其它基礎消息模式,否則,即使服務操作返回void(在 Visual Basic 中為 Nothing)。也屬於請求/答復消息交換。
– 操作的結果是:除非client異步調用操作,否則client將停止處理。直到收到返回消息,即使該消息正常情況下為空時也是如此。
缺點
– 假設執行操作須要非常長的時間,則會減少client性能和響應能力
? 長處
– 響應消息中可返回 SOAP 錯誤,這表明可能在通信或處理中發生了一些與服務有關的錯誤狀況
2、單向模式
– 假設 WCF 服務應用程序的client不必等待操作完畢。而且不處理 SOAP 錯誤,則該操作能夠指定單向消息模式。
– ?單向操作是client調用操作並在 WCF 將消息寫入網絡後繼續進行處理的操作。 通常這意味著。除非在出站消息中發送的數據極其龐大,否則client差點兒馬上繼續執行(除非發送數據時出錯)。此種類型的消息交換模式支持從client到服務應用程序的相似於事件的行為。
– 若要為返回 void 的操作指定單向消息交換。請將 IsOneWay 屬性設置為 true。默覺得false.
[OperationContract(IsOneWay=true)] void Hello(string greeting);
此方法與前面的請求/答復演示樣例同樣,可是,將 IsOneWay屬性設置為 true 意味著雖然方法同樣。服務操作也不會發送返回消息,而client將在出站消息抵達通道層時馬上返回。
? 即使用 IsOneWay=true 標記的操作不得聲明輸出參數、引用參數或返回值
3、雙工模式
– 雙工模式的特點是,不管使用單向消息發送還是請求/答復消息發送方式,服務和client均能夠獨立地向對方發送消息。 對於必須直一( 接與client通信或向消息交換的隨意 方提供異步體驗 包含相似於事件的行為)的服務來說,這樣的雙向通信形式非常實用
– 由於存在與client通信的附加機制,雙向模式比請求/答復或單向模式要略為復雜
– 若要設計雙工協定,還必須設計回調協定,並將該回調協定的類型分配給標記服務協定的 ServiceContractAttribute 屬性 (attribute)的 CallbackContract 屬性 (property)。
– 若要實現雙工模式,您必須創建第二個接口,該接口包含在client調用的方法聲明
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples",SessionMode=SessionMode.Required,CallbackContract=typeof(ICalculatorDuplexCallback))] public interface ICalculatorDuplex { [OperationContract(IsOneWay = true)] void Clear(); } public interface ICalculatorDuplexCallback { [OperationContract(IsOneWay = true)] void Equals(double result); [OperationContract(IsOneWay = true)] void Equation(string eqn); }
小註:
? 面向服務的應用程序(比如 Windows Communication Foundation(WCF) 應用程序)設計為與 Microsoft 平臺和非 Microsoft 平臺上的最大可能數量的client應用程序進行互操作。
? 為了獲得最大可能的互操作性,建議您使用 DataContractAttribute 和DataMemberAttribute 屬性對您的類型進行標記,以創建數據協定。
? 數據協定是服務協定的一部分,用於描寫敘述您的服務操作交換的數據。
? 數據協定是可選的樣式協定:除非您顯式應用數據協定屬性,否則不會序列化不論什麽類型或數據成員
? 數據協定與托管代碼的訪問範圍無關 能夠對私有數據成員進行序列化。並將其發送到其它位置。以便能夠公開訪問它們
? WCF 處理用於啟用操作功能的基礎 SOAP 消息的定義,並處理數據類型到消息正文的序列化和從消息正文進行的反序列化。
數據類型一旦序列化,您就無需在設計操作時考慮基礎消息交換基礎結構
? 能夠使用其它序列化機制。 標準 ISerializable, SerializableAttribute和 IXmlSerializable 機制都可用於處理數據類型到基礎 SOAP 消息的序列化。這些消息可將數據類型從一個應用程序帶到還有一個應用程序
Out 和Ref參數
? 大部分情況下,您能夠使用 in 參數(Visual Basic 中為 ByVal)、out 和 ref 參數(Visual Basic 中為 ByRef)。 由於 out 和 ref 參數都指示數據是從操作返回的,相似例如以下的操作簽名會指定須要請求/答復操作,即使操作簽名返回 void 也是如此
[ServiceContract] public interface IMyContract { [OperationContract] void PopulateData(ref CustomDataType data); }? 使用 out 或 ref 參數要求操作具有基礎響應消息,才幹夠將已改動的對象傳回。 假設操作是單向操作,則將在執行時引發InvalidOerationExcetion 異常?
小註:
本文整理自:徐長龍?跟我一起從零開始學WCF系列課程(2):設計和實現服務協定 (Level 200) 教程
WCF 設計和實現服務協定(01)