WCF消息交換應用方式技巧分享
WCF開發(fā)插件的出現(xiàn)為我們帶來了許多不一樣的體驗。而且其在實際應用中起到了非常重要的作用。在這里我們將會為大家詳細介紹一下其中一個比較重要的基礎知識,WCF消息交換的應用技巧。
客戶端和服務之間通過消息交換(Message Exchange)來完成方法調(diào)用和數(shù)據(jù)傳遞,WCF消息交換擁有三種定義方式。
WCF消息交換之1. Request/Reply
這是缺省模式,又稱為同步調(diào)用。在調(diào)用服務方法后需要要等待服務消息的返回。
- Public Class Service1
- Implements IService1
- Public Sub Run() Implements IService1.Run
- Threading.Thread.Sleep(4000) '停四秒
- End Sub
- End Class
客戶端調(diào)用
- Dim s As New ServiceReference1.Service1Client
- s.Open()
- Console.WriteLine("開始執(zhí)行時間: {0}", Now.ToString)
- s.Run()
- Console.WriteLine("結(jié)束執(zhí)行時間:{0}", Now.ToString)
- s.Close()
- Console.ReadKey()
運行結(jié)果#t#
開始執(zhí)行時間: 2009-11-06 16:53:51
結(jié)束執(zhí)行時間:2009-11-06 16:53:55
相差了四秒了。
WCF消息交換之2.one-way模式
這種方式在調(diào)用方法后會立即返回,非常類似于異步行為。不過需要注意的是one-way只能用在過程方法是,而不用于函數(shù)。
接口定義如下,實現(xiàn)不用更改
- < ServiceContract()> _
- Public Interface IService1
- < OperationContract(isoneway:=True)> _
- Sub Run()
- End Interface
我們來看一下運行結(jié)果:
開始執(zhí)行時間: 2009-11-06 16:58:28
結(jié)束執(zhí)行時間:2009-11-06 16:58:28
馬上就返回了結(jié)果
注意使用此模式,不得聲明輸出參數(shù)、引用參數(shù)或返回值。
WCF消息交換之3. duplex
這種模式相對復雜一些,我們詳細描述一下步驟:
(1).設計標準的服務契約。為了完成回調(diào)操作,我們必須指定SessionMode和回調(diào)類型
- < ServiceContract(SessionModeSessionMode:=SessionMode.Required,
callbackcontract:=GetType(ICallback))> _- Public Interface IService1
- < OperationContract(isoneway:=True)> _
- Sub Run(ByVal name As String)
- End Interface
設置回調(diào)接口類型。由于回調(diào)方法在客戶端執(zhí)行,因此無須加ServiceContractAttribute屬性。對于回調(diào)操作,服務器無須獲取返回消息,因此添加isOneWay:=True特性參數(shù)。
- Public Interface ICallback
- < OperationContract()> _
- Sub [Call](ByVal t As DateTime)
- End Interface
實現(xiàn)服務契約,通過OperationContext.Current.GetCallBackChannel可以獲取回調(diào)委托,進而完成調(diào)用。
- 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("結(jié)束執(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
小結(jié):
運行沒有問題,但是 Call 方法,并沒有進行打印,也沒有刪除C盤下面的1.xml文件。百思不得其解,同時反現(xiàn)不知道怎么調(diào)試服務端。這次雖然按照網(wǎng)上博客實現(xiàn)了三種消息傳遞的方式,但是沒有理解其中的奧秘。
以上就是對WCF消息交換的具體介紹。