天天看點

WCF入門(三)——消息交換模式

在WCF中的消息交換模式:

(一)one way

單向:使用單向操作時,隻能傳輸一個消息。 接收方不發送答複消息,發送方也不需要獲得答複消息。如果是單向,那麼意味着服務處理客戶請求的過程中出現的異常資訊,也無法傳遞到客戶。

現在示範一個單向交換:

[OperationContract(IsOneWay=true)]

void ChatMessage(string strMsg);

實作:

public void ChatMessage(string strMsg)

{

    Console.WriteLine("使用者的資訊:{0}",strMsg);

}

在用戶端調用,并傳送字串:12345

這裡,通過包的情況可以看出:用戶端隻有請求消息,但沒有響應。在這裡有個疑問,雖然是單向,而沒有響應,這個響應是指沒有soap響應。但還是有http頭資訊回來。

HTTP/1.1 202 Accepted

Content-Length: 0

Server: Microsoft-HTTPAPI/1.0

Date: Sat, 13 Mar 2010 02:28:10 GMT

如果要設定單向交換,那麼在契約上添加IsOneWay=true,因為是單向的,不向用戶端傳回消息,是以對單向的方法有些限制,做為單向的方法不能有傳回值,且不能帶有out,ref的參數。

(二)Request/Reply

RR模式是預設的消息交換模式。用戶端請求并等待服務端的應答,即使對于無傳回值的方法來說,也會傳回應答。因為這是預設的消息交換模式,是以隻要添加OperationContract即可。

去掉單向中的單向屬性:

[OperationContract]

這就是一個RR消息交換模式,現在看它的包情況:

隻看請求部分的body部分:

<s:Body>

<ChatMessage xmlns="http://www.selftest.com/test1">

         <strMsg>12345</strMsg>

      </ChatMessage>

</s:Body>

然後看響應部分:

<s:Envelope

xmlns:s="http://www.w3.org/2003/05/soap-envelope"

xmlns:a="http://www.w3.org/2005/08/addressing">

<s:Header>

<a:Action s:mustUnderstand="1">

http://www.selftest.com/test1

/ICaculateService/ChatMessageResponse</a:Action>

<a:RelatesTo>

urn:uuid:38af3c52-0ace-40ab-94e8-9c609c39452a

</a:RelatesTo>

</s:Header>

<ChatMessageResponse

xmlns="http://www.selftest.com/test1" />

</s:Envelope>

RR模式比較明确,用戶端就是請求,而服務端用于應答。

(三)Duplex

雙工消息交換模式,它可以使用戶端程式能夠偵聽入站操作調用。讓用戶端可以處理從服務端發出的調用。

為服務契約添加回調屬性。

[ServiceContract(CallbackContract=typeof(ISelfCallback))]

public interface ICaculateService

回調接口:

[ServiceContract]

public interface ISelfCallback

void DoService(string strMsg);

回調接口用于向用戶端發送請求。

現在為ChatMessage

方法添加回調資訊:

    Console.WriteLine("用戶端使用者的資訊:{0}",strMsg);

ISelfCallback _callback =

OperationContext.Current.GetCallbackChannel<ISelfCallback>();

    _callback.DoService("這是服務端的時間:"+ DateTime.Now);

用戶端實作回調接口:

public class SelfCallBack1 : FirstInstance.ICaculateServiceCallback

public void DoService(string strMsg)

    Console.WriteLine("用戶端一方接收到的資訊:{0}", strMsg);

在調用時:

SelfCallBack1 _callback = new SelfCallBack1();

FirstInstance.CaculateServiceClient client =

new UNTest.FirstInstance.CaculateServiceClient

(new InstanceContext(_callback));

client.ChatMessage("12345");

請服務端請求後,得到對方的應答,并處理來自服務端的請求。

部落格園大道至簡

<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>

轉載請注明:部落格園

繼續閱讀