新聞中心
WCF開發(fā)插件對于開發(fā)人員來說是一個比較重要的應用工具,可以幫助我們輕松的實現(xiàn)一些特定的功能需求。在這里我們就一起來分享一下有關WCF回調操作的相關操作技巧。WCF回調操作簡單的說就是由服務端來調用客戶端的方法,回調時原先的服務端和客戶端將發(fā)生對調,服務端成為客戶端,客戶端成為服務端。#t#

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網(wǎng)站建設、網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的湯原網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
WCF回調的必要條件:
1、并不是所有的綁定都支持回調操作,只有具有雙向通信能力的綁定才可以使用回調。比如HTTP是與連接無關的因此不能用于回調。這就說明我們不能使用BasicHttpBinding或WSHttpBinding進行回調。WCF中NetTcpBinding和 NetNamedPipeBinding支持回調,因為從本質上講TCP和IPC協(xié)議支持雙向通信。WCF中wsDualHttpBinding也是支持回調的因為它實際上是設置了兩個HTTP通道
定義回調契約
一個服務契約若要定義回調,必須專門定義一個用于回調的契約。一個服務契約最多包含一個回調契約,一個服務契約一旦定義了回調契約那客戶端必須支持這個WCF回調操作。那如何為一個服務契約定義回調呢?使用ServiceContract特性的CallBackContract特性,代碼如下:
- [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))]
- public interface IService1
- {
- [OperationContract(IsOneWay=true)]
- void DoSomething();
- }
- //用于回調的契約
- interface ISomeCallbackContract
- {
- [OperationContract(IsOneWay=true)]
- void SomeCallbackMethod();
- [OperationContract(IsOneWay = true)]
- void SomeCallbackMethod2();
- }
客戶端WCF回調操作設置
客戶端需要實現(xiàn)服務端定義的那個用于回調的契約ISomeCallbackContract,然后實例化回調對象再通過它創(chuàng)建一個上下文對象InstanceContext。然后用代理把這個回調的引用傳回服務端
下面通過代碼實例說明:
服務端代碼:
- [ServiceContract(CallbackContract = typeof(ISomeCallbackContract))]
- public interface IService1
- {
- [OperationContract(IsOneWay=true)]
- void DoSomething();
- }
- //用于回調的契約
- interface ISomeCallbackContract
- {
- [OperationContract(IsOneWay=true)]
- void SomeCallbackMethod();
- [OperationContract(IsOneWay = true)]
- void SomeCallbackMethod2();
- }
實現(xiàn)服務的類:
- [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,
ConcurrencyMode = ConcurrencyMode.Reentrant)]- public class Service1 : IService1
- {
- static List
m_Callbacks = new
List(); - public void DoSomething()
- {
- //獲得由客戶端傳入的回調終結點的引用,使用這個引用可以調用客戶端方法
- ISomeCallbackContract callback = OperationContext.Current.
GetCallbackChannel(); - if (m_Callbacks.Contains(callback) == false)
- {
- m_Callbacks.Add(callback);
- }
- Trace.WriteLine("DoSomething");
- //調用客戶端實現(xiàn)的SomeCallbackMethod2方法,
- callback.SomeCallbackMethod2();
- CallClients();
- }
- static public void CallClients()
- {
- Action
invoke =
delegate(ISomeCallbackContract callback)- {
- callback.SomeCallbackMethod();
- };
- m_Callbacks.ForEach(invoke);
- }
- }
客戶端代碼:
- //客戶端實現(xiàn)回調接口,使用VS自動生成代理的時候,對于回調接口的命名默認是
以服務契約接口名稱+Callback,而不是原先在服務端定義的回調接口的名子- public class CallBack : ServiceReferenceCallBack.IService1Callback
- {
- public void SomeCallbackMethod()
- {
- MessageBox.Show("SomeCallbackMethod()", "MyClient");
- }
- public void SomeCallbackMethod2()
- {
- MessageBox.Show("SomeCallbackMethod2()", "MyClient");
- }
- }
客戶端調用
首先生成回調接口實現(xiàn)的對象,然后用這個對象去實例化一個上下文對象context ,在創(chuàng)建客戶端代理對象的時候在構造方法中使用這個上下文對象context 就可以把客戶端回調對象的引用作為消息的一部分傳送到服務端,在服務端就可以通過 OperationContext.Current.GetCallbackChannel
- ServiceReferenceCallBack.IService1Callback callback = new CallBack();
- InstanceContext context = new InstanceContext(callback);
- ServiceReferenceCallBack.Service1Client sc = new
WCFPrograme.ServiceReferenceCallBack.Service1Client(context);- sc.DoSomething();
當前標題:WCF回調操作是雞應用技巧講解
網(wǎng)頁網(wǎng)址:http://m.5511xx.com/article/dhhdsdg.html


咨詢
建站咨詢
