三種WCF消息交換常見模式解讀
WCF剛剛開始學的時候會覺得比較難以掌握,其實我們可以通過在實踐中慢慢去體會那些難以掌握的知識點。當我們在實際使用中,會發(fā)現(xiàn)WCF消息交換總共有三種模式。#t#
WCF消息交換1. Request/Reply
這是缺省模式,又稱為同步調用。在調用服務方法后需要要等待服務消息的返回。
- Public Class Service1
- Implements IService1
- Public Sub Run() Implements
IService1.Run - Threading.Thread.Sleep(4000) '停四秒
- End Sub
- End Class
客戶端調用
- Dim s As New ServiceReference1
.Service1Client- s.Open()
- Console.WriteLine("開始執(zhí)行時間:
{0}", Now.ToString)- s.Run()
- Console.WriteLine("結束執(zhí)行時間:
{0}", Now.ToString)- s.Close()
- Console.ReadKey()
運行結果
開始執(zhí)行時間: 2009-11-06 16:53:51
結束執(zhí)行時間:2009-11-06 16:53:55
相差了四秒了。
WCF消息交換2.one-way模式
這種方式在調用方法后會立即返回,非常類似于異步行為。不過需要注意的是one-way只能用在過程方法是,而不用于函數(shù)。
接口定義如下,實現(xiàn)不用更改
- < ServiceContract()> _
- Public Interface IService1
- < OperationContract
(isoneway:=True)> _- Sub Run()
- End Interface
我們來看一下運行結果:
開始執(zhí)行時間: 2009-11-06 16:58:28
結束執(zhí)行時間:2009-11-06 16:58:28
馬上就返回了結果
注意使用此模式,不得聲明輸出參數(shù)、引用參數(shù)或返回值。
WCF消息交換3. duplex
這種模式相對復雜一些,我們詳細描述一下步驟:
(1).設計標準的服務契約。為了完成回調操作,我們必須指定SessionMode和回調類型
- < ServiceContract(SessionMode
SessionMode:=SessionMode.Required,
callbackcontract:=GetType(ICallback))> _- Public Interface IService1
- < OperationContract(isoneway:=True)> _
- Sub Run(ByVal name As String)
- End Interface
設置回調接口類型。由于回調方法在客戶端執(zhí)行,因此無須加ServiceContractAttribute屬性。對于回調操作,服務器無須獲取返回消息,因此添加isOneWay:=True特性參數(shù)。
- Public Interface ICallback
- < OperationContract()> _
- Sub [Call](ByVal t As DateTime)
- End Interface
- 實現(xiàn)服務契約,通過OperationContext
.Current.GetCallBackChannel
可以獲取回調委托,進而完成調用。- Code
- Public Class Service1
- Implements IService1
- 'ICallback callback = OperationContext
.Current.GetCallbackChannel< ICallback>();- Dim callback As ICallback =
OperationContext.Current.
GetCallbackChannel(Of ICallback)()- Public Sub Run(ByVal name As
String) Implements IService1.Run- Threading.Thread.Sleep(1000) '停四秒
- Me.callback.Call(Now)
- Console.WriteLine("Run Time
" & Now.ToString)- End Sub
- End Class
這時運行時,會出現(xiàn)以前異常:
System.InvalidOperationException: 協(xié)定需要雙工,但是綁定“WSHttpBinding”不支持它或者因配置不正確而無法支持它。
需要更改服務器的配置文件:
< endpoint address ="" binding="wsHttpBinding" contract="異步.IService1">中的wsHttpBinding改為wsDualHttpBinding,客戶端重新更新服務器引用即可
客戶端實現(xiàn):
- Sub Main()
- Dim s As New ServiceReference1
.Service1Client(New System.
ServiceModel.InstanceContext
(New ContractCallback))- Console.WriteLine("開始執(zhí)行時間:
{0}", Now.ToString)- s.Run("aa")
- Console.WriteLine("結束執(zhí)行時間:
{0}", Now.ToString)- Console.ReadKey()
- End Sub
- Public Class ContractCallback
- Implements ServiceReference1.
IService1Callback- Public Sub [Call](ByVal t As Date)
Implements ServiceReference1
.IService1Callback.Call- IO.File.Delete("c:\1.xml")
- Console.WriteLine("Call AppDomain:"
& AppDomain.CurrentDomain.FriendlyName)- Console.WriteLine("Server DateTime:"
& t.ToString)- End Sub
- End Class
小結:
運行沒有問題,但是 Call 方法,并沒有進行打印,也沒有刪除C盤下面的1.xml文件。百思不得其解,同時反現(xiàn)不知道怎么調試服務端。這次雖然按照網上博客實現(xiàn)了三種WCF消息交換的方式,但是沒有理解其中的奧秘。