WCF 設計和實現服務協定(01)

衣舞晨風發表於2015-07-19

作者:jiankunking 出處:http://blog.csdn.net/jiankunking


WCF 術語:

• 訊息
– 訊息是一個獨立的資料單元,它可能由幾個部分組成,包括訊息正文和訊息頭。
• 服務
– 服務是一個構造,它公開一個或多個終結點,其中每個終結點都公開一個或多個服務操作。
• 終結點
– 終結點是用來傳送或接收訊息(或執行這兩種操作)的構造。 終結點包括一個定義訊息可以傳送到的目的地的位置(地址)、一個描述訊息應如何傳送的通訊機制規範(繫結)以及對於可以在該位置傳送或接收(或兩者皆可)的一組訊息的定義(服務協定)— 該定義還描述了可以傳送何種訊息。

– WCF 服務作為一個終結點集合向外界公開。

小注:

WCF服務即在服務端為客戶端提供一系列方法的集合。這些方法可以是在一個類中的,也可以是包含在不同類中的。終結點即是指這些類,即一系列方法的入口。



建立服務協定: 

• 類或介面都可以定義服務協定
• 建議使用介面,因為介面可以直接對服務協定建模
• 服務協定介面具有託管介面的所有優點:
– 服務協定介面可以擴充套件任何數量的其他服務協定介面。
– 一個類可以通過實現服務協定介面來實現任意數量的服務協定。
– 可以通過更改介面實現來修改服務協定的實現,而讓服務協定保持不變。
– 可以通過實現舊介面和新介面來確定服務的版本。 老客戶端連線到原始版本,而新客戶端則可以連線到較新的版本。


• 定義服務協定
– 在類或介面上使用 ServiceContractAttribute 屬性標記


• 定義服務操作
 – 在方法上使用 OperationContractAttribute 屬性對其進行標記


• 引數和返回值
– 每個操作都有一個返回值和一個引數,即使它們為 void。 可以使用區域性方法將對物件的引用從一個物件傳遞到另一個物件,但與區域性方法不同的是,服務操作不會傳遞對物件的引用, 它們傳遞的只是物件的副本。
– 這一點很重要,這是因為引數或返回值中使用的每個型別都必須是可序列化的,換言之,該型別的物件必須能夠轉換為位元組流,並能夠從位元組流轉換為物件。
– 預設情況下,基元型別是可序列化的,.NET Framework 中的很多型別都是可序列化的。


建立服務協定  服務操作的訊息模式

1、請求/答覆模式
– 通過請求/答覆模式,請求傳送方(客戶端應用程式)將接收與請求相關的答覆。 這是預設的模式,因為它既支援傳入操作(一個或多個引數傳遞到該操作中 ),也 支援返回操作(該操作將一個或多個輸出值傳回給呼叫方)

[OperationContract]
string Hello(string greeting);
請注意,除非指定其他基礎訊息模式,否則,即使服務操作返回void(在 Visual Basic 中為 Nothing),也屬於請求/答覆訊息交換。
– 操作的結果是:除非客戶端非同步呼叫操作,否則客戶端將停止處理,直到收到返回訊息,即使該訊息正常情況下為空時也是如此。

缺點
– 如果執行操作需要很長的時間,則會降低客戶端效能和響應能力
• 優點
– 響應訊息中可返回 SOAP 錯誤,這表明可能在通訊或處理中發生了一些與服務有關的錯誤狀況

2、單向模式

– 如果 WCF 服務應用程式的客戶端不必等待操作完成,並且不處理 SOAP 錯誤,則該操作可以指定單向訊息模式。
–  單向操作是客戶端呼叫操作並在 WCF 將訊息寫入網路後繼續進行處理的操作。 通常這意味著,除非在出站訊息中傳送的資料極其龐大,否則客戶端幾乎立即繼續執行(除非傳送資料時出錯)。此種型別的訊息交換模式支援從客戶端到服務應用程式的類似於事件的行為。
– 若要為返回 void 的操作指定單向訊息交換,請將 IsOneWay 屬性設定為 true,預設為false.

[OperationContract(IsOneWay=true)]
void Hello(string greeting);

此方法與前面的請求/答覆示例相同,但是,將 IsOneWay屬性設定為 true 意味著儘管方法相同,服務操作也不會傳送返回訊息,而客戶端將在出站訊息抵達通道層時立即返回。

  即使用 IsOneWay=true 標記的操作不得宣告輸出引數、引用引數或返回值


3、雙工模式

– 雙工模式的特點是,無論使用單向訊息傳送還是請求/答覆訊息傳送方式,服務和客戶端均能夠獨立地向對方傳送訊息。 對於必須直一( 接與客戶端通訊或向訊息交換的任意 方提供非同步體驗 包括類似於事件的行為)的服務來說,這種雙向通訊形式非常有用
– 由於存在與客戶端通訊的附加機制,雙向模式比請求/答覆或單向模式要略為複雜
若要設計雙工協定,還必須設計回撥協定,並將該回撥協定的型別分配給標記服務協定的 ServiceContractAttribute 屬性 (attribute)的 CallbackContract 屬性 (property)。
– 若要實現雙工模式,您必須建立第二個介面,該介面包含在客戶端呼叫的方法宣告

[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 平臺上的最大可能數量的客戶端應用程式進行互操作。
• 為了獲得最大可能的互操作性,建議您使用 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) 教程


相關文章