在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");
請服務端請求後,得到對方的應答,并處理來自服務端的請求。
部落格園大道至簡
http://www.cnblogs.com/jams742003/轉載請注明:部落格園