WCF雙向通信相關(guān)概念正確理解
WCF的出現(xiàn),給開發(fā)領(lǐng)域帶來了不小的變化。那么如何才能正確的應(yīng)用這一新的技術(shù)呢?在這里我們可以先從WCF雙向通信的相關(guān)概念開始了解,以此來進一步加深我們對這一工具的了解程度。#t#
WCF整合了Remoting和webService等等。而且開發(fā)簡單(相對的),它既彌補Remoting的只能在.net上運行,又彌補了asmx只能單向傳送消息的缺點。也就是說,WCF是實現(xiàn)跨平臺,在跨平臺的同時,也可以雙向通信。在WCF的編程思想中,無疑將SOA的思想體現(xiàn)的***。
首先要做的是就是定義服務(wù)契約。定義契約一般使用接口,使得實現(xiàn)和消費這個服務(wù)的雙方都要按照這個契約來實現(xiàn)相應(yīng)的接口。在雙向通信中至少要定義兩個服務(wù),一個服務(wù)是供消費程序消費的,另一個則是在callBack的時候調(diào)用的服務(wù),這個服務(wù)應(yīng)該由消費程序?qū)崿F(xiàn)。
其次,就是在服務(wù)端實現(xiàn)這些契約(說白了就是實現(xiàn)上面定義的接口)。在開發(fā)中,我們經(jīng)常會把這個實現(xiàn)獨立出來,方便在不同的宿主中發(fā)布這些服務(wù)。
***,實現(xiàn)客戶端。在WCF雙向通信中,客戶端也是服務(wù)端,因為它也實現(xiàn)了服務(wù)契約。
來段代碼:
- namespace Lin.Contract
- {
- [ServiceContract(CallbackContract=typeof(ICallBack))]
- public interface IHello
- {
- [OperationContract]
- void SayHelloTo(string userName);
- }
- }
- namespace Lin.Contract
- {
- [ServiceContract]
- public interface ICallBack
- {
- [OperationContract]
- void ReceiveTime(DateTime time);
- }
- }
- Service:
- namespace Lin.Service
- {
- [ServiceBehavior(ConcurrencyModeConcurrencyMode =
ConcurrencyMode.Reentrant)]- public class ServiceHello : IHello
- {
- IHello 成員#region IHello 成員
- public void SayHelloTo(string userName)
- {
- Console.WriteLine("Hello {0}", userName);
- OperationContext.Current.GetCallbackChannel<ICallBack>()
.ReceiveTime(DateTime.Now);- }
- #endregion
- }
- }Host:
- class Program
- {
- static void Main(string[] args)
- {
- using (ServiceHost host = new ServiceHost(typeof(ServiceHello)))
- {
- host.Open();
- Console.Read();
- }
- }
- }Client:
- namespace Lin.Client
- {
- public class ClientCallBack:ICallBack
- {
- ICallBack 成員#region ICallBack 成員
- public void ReceiveTime(DateTime time)
- {
- Console.WriteLine("服務(wù)器收到消息的時間是:{0}",
time.ToLongTimeString());- }
- #endregion
- }
- }
WCF雙向通信調(diào)用服務(wù):
- namespace Lin.Client
- {
- public class ClientHello : DuplexClientBase<IHello>, IHello
- {
- public ClientHello(InstanceContext instance) : base(instance) { }
IHello 成員#region IHello 成員
- public void SayHelloTo(string userName)
- {
- base.Channel.SayHelloTo(userName);
- }
- #endregion
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Hello();
- Console.Read();
- }
- static void Hello()
- {
- ClientCallBack callBack = new ClientCallBack();
- ClientHello hello = new ClientHello(new InstanceContext(callBack));
- string commandString = string.Empty;
- while (commandString != "exit")
- {
- commandString = Console.ReadLine();
- hello.SayHelloTo(commandString);
- }
- }
- }
以上就是我們對WCF雙向通信的相關(guān)介紹。