在WCF初探-5:WCF消息交換模式之雙工通信(Duplex)博文中,我講解了雙工通訊服務的一個應用場景,即訂閱和發佈模式,這一篇,我將經過一個消息發送的例子講解一下WCF客戶端如何爲雙工服務建立回調對象。html
雙工服務指定一個回調協定,客戶端應用程序必須實現該協定以便提供一個該服務可以根據協定要求調用的回調對象。雖然回調對象不是完整的服務(例如,您沒法使用回調對象啓動一個通道),可是爲了實現和配置,這些回調對象能夠被視爲一種服務。ide
雙工服務的客戶端必須:函數
雙工 WCF 客戶端對象除了會公開支持回調所必需的功能(包括回調服務的配置)之外,其餘的功能和它們的非雙工對應項相同。ui
IMessageExchange.cs的代碼以下:spa
using System.ServiceModel; using System.Collections.Generic; using System.Runtime.Serialization; namespace Service { [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IMessageExchangeCallback))] public interface IMessageExchange { [OperationContract(IsOneWay=true)] void Send(string message); } public interface IMessageExchangeCallback { [OperationContract(IsOneWay = true)] void Receive(string message); } }
MessageExchange.cs的代碼以下: 3d
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace Service { [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)] public class MessageExchange : IMessageExchange { public void Send(string message) { Console.WriteLine("服務端監聽客戶端發出的消息:" + message); Callback.Receive(message); } IMessageExchangeCallback Callback { get { return OperationContext.Current.GetCallbackChannel<IMessageExchangeCallback>(); } } } }
注意:回調契約接口IMessageExchangeCallback中的Receive方法是在客戶端實現的,因此若是須要在服務端調用回調方法就必須經過當前操做的實例上下文來獲取,即上面代碼中的Callback對象。code
2. Host:控制檯應用程序。提供服務寄宿程序,添加對Srevice程序集的引用。完成配置文件和代碼就能夠承載服務。xml
Program.cs的代碼以下:htm
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Service; using System.ServiceModel; namespace Host { class Program { static void Main(string[] args) { using (ServiceHost host = new ServiceHost(typeof(MessageExchange))) { host.Opened += delegate { Console.WriteLine("服務已經啓動,按任意鍵終止!"); }; host.Open(); Console.Read(); } } } }
App.config的代碼以下:對象
<?xml version="1.0"?> <configuration> <system.serviceModel> <services> <service name="Service.MessageExchange" behaviorConfiguration="mexBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:1234/MessageExchange/"/> </baseAddresses> </host> <endpoint address="" binding="wsDualHttpBinding" contract="Service.IMessageExchange" /> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="mexBehavior"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
3. Client:控制檯應用程序。客戶端程序,啓動服務承載程序Host後,添加對服務地址http://localhost:1234/MessageExchange/的引用,將命名空間修改成
MessageExchangeServiceRef,以後在Program.cs完成對雙工服務回調接口IMessageExchangeCallback的實現和對服務方法的調用。Program.cs的代碼以下:
using System; using Client.MessageExchangeServiceRef; using System.ServiceModel; namespace Client1 { public class CallBackHandler : IMessageExchangeCallback { public void Receive(string message) { Console.WriteLine("客戶端監聽服務端接收的消息:" + message); } } class Program { static void Main(string[] args) { InstanceContext instanceContext = new InstanceContext(new CallBackHandler()); MessageExchangeClient proxy = new MessageExchangeClient(instanceContext); proxy.Send("Wcf Duplex"); Console.Read(); } } }
運行結果以下: