WCF双工通信笔记
1,Dupex(雙工)?MEP(消息交換模式),服務(wù)端回調(diào)(Callback)客戶端操作
2,客戶端調(diào)用服務(wù)時,附加上一個回調(diào)對象(InstanceContext)。服務(wù)端處理服務(wù)請求時,通過該回調(diào)對象調(diào)用客戶端操作。
3,WCF系統(tǒng)設(shè)計常用四層結(jié)構(gòu):Contracts(契約),Services(服務(wù)),Hosting(服務(wù)寄宿),Clients(客戶端)
4,客戶端調(diào)用服務(wù),需要服務(wù)契約;服務(wù)端回調(diào)客戶端操作,同樣需要回調(diào)契約。回調(diào)契約通過ServiceContract(服務(wù)契約)特性的CallbackContract屬性指定
5,回調(diào)契約本質(zhì)也是服務(wù)契約,但在服務(wù)契約里已指明該回調(diào)契約的服務(wù)契約屬性,所以回調(diào)契約不需要再標(biāo)記ServiceContract屬性
6,服務(wù)端在處理服務(wù)請求時,通過當(dāng)前的OperationContext.Current.GetCallback<T>方法獲取回調(diào)對象,T代表回調(diào)契約的類型
7,OperationContext代表服務(wù)操作執(zhí)行上下文,通過靜態(tài)屬性Current獲取當(dāng)前OperationContent。我們可以在服務(wù)端或客戶端設(shè)置一些上下文,比如為出棧消息添加Soap報頭,從入棧消息取出報頭等
8,為執(zhí)行回調(diào),客戶端首先要實現(xiàn)回調(diào)契約:定義繼承回調(diào)契約的類,實現(xiàn)回調(diào)契約接口方法
9,調(diào)用雙工服務(wù),先創(chuàng)建回調(diào)對象,并通過InstanceContext對回調(diào)對象包裝,然后用DuplexChannelFactory<TChannel>方法創(chuàng)建服務(wù)通道。
10,用服務(wù)通道的CreateChannel方法生成服務(wù)代理對象,進而調(diào)用服務(wù)方法。
11,服務(wù)響應(yīng)請求,回調(diào)回調(diào)對象的方法,在客戶端執(zhí)行回調(diào)方法。
?契約定義:
using System.ServiceModel; namespace Contracts {[ServiceContract(CallbackContract = typeof(ICallback))]public interface ICalculator{[OperationContract(IsOneWay =true)]void Add(double x,double y);}public interface ICallback{[OperationContract(IsOneWay = true)]void DisplayResult(double x, double y, double result);} }服務(wù)實現(xiàn):
using Contracts; namespace Services {public class CalculatorService : ICalculator{public void Add(double x, double y){double result = x + y;ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();callback.DisplayResult(x,y, result);}} }服務(wù)寄宿:
using System; using System.ServiceModel; using Services; namespace Hosting {class Program{static void Main(string[] args){using (ServiceHost host = new ServiceHost(typeof(CalculatorService))){host.Open();Console.Read();}}} }寄宿配置:
<system.serviceModel><services><service name="Services.CalculatorService"><endpoint address="net.tcp://127.0.0.1:9999/CalculatorService" binding="netTcpBinding" contract="Contracts.ICalculator"/></service></services></system.serviceModel>客戶端調(diào)用及回調(diào)實現(xiàn):
using Contracts; using System; using System.ServiceModel; namespace Clients {class Program{static void Main(string[] args){InstanceContext instanceContext = new InstanceContext(new CalculatorCallback());using (DuplexChannelFactory<ICalculator> ChannelFactory = new DuplexChannelFactory<ICalculator>(instanceContext, "CalculatorService")){ICalculator prox = ChannelFactory.CreateChannel();using (prox as IDisposable){prox.Add(1, 2);Console.Read();}}}}class CalculatorCallback : ICallback{public void DisplayResult(double x, double y, double result){Console.WriteLine($"{x} + {y} = {result}");}} }客戶端配置:
<system.serviceModel><client><endpoint name ="CalculatorService" address="net.tcp://127.0.0.1:9999/CalculatorService" binding="netTcpBinding" contract="Contracts.ICalculator"/></client></system.serviceModel>WCF Tcp雙工通信 Get !
轉(zhuǎn)載于:https://www.cnblogs.com/TianPing/p/10056472.html
總結(jié)
- 上一篇: HDU 2012 素数判断方式
- 下一篇: Netty构建游戏服务器(一)--基本概