WCF雙向通信相關(guān)概念正確理解
WCF的出現(xiàn),給開(kāi)發(fā)領(lǐng)域帶來(lái)了不小的變化。那么如何才能正確的應(yīng)用這一新的技術(shù)呢?在這里我們可以先從WCF雙向通信的相關(guān)概念開(kāi)始了解,以此來(lái)進(jìn)一步加深我們對(duì)這一工具的了解程度。#t#
WCF整合了Remoting和webService等等。而且開(kāi)發(fā)簡(jiǎn)單(相對(duì)的),它既彌補(bǔ)Remoting的只能在.net上運(yùn)行,又彌補(bǔ)了asmx只能單向傳送消息的缺點(diǎn)。也就是說(shuō),WCF是實(shí)現(xiàn)跨平臺(tái),在跨平臺(tái)的同時(shí),也可以雙向通信。在WCF的編程思想中,無(wú)疑將SOA的思想體現(xiàn)的***。
首先要做的是就是定義服務(wù)契約。定義契約一般使用接口,使得實(shí)現(xiàn)和消費(fèi)這個(gè)服務(wù)的雙方都要按照這個(gè)契約來(lái)實(shí)現(xiàn)相應(yīng)的接口。在雙向通信中至少要定義兩個(gè)服務(wù),一個(gè)服務(wù)是供消費(fèi)程序消費(fèi)的,另一個(gè)則是在callBack的時(shí)候調(diào)用的服務(wù),這個(gè)服務(wù)應(yīng)該由消費(fèi)程序?qū)崿F(xiàn)。
其次,就是在服務(wù)端實(shí)現(xiàn)這些契約(說(shuō)白了就是實(shí)現(xiàn)上面定義的接口)。在開(kāi)發(fā)中,我們經(jīng)常會(huì)把這個(gè)實(shí)現(xiàn)獨(dú)立出來(lái),方便在不同的宿主中發(fā)布這些服務(wù)。
***,實(shí)現(xiàn)客戶端。在WCF雙向通信中,客戶端也是服務(wù)端,因?yàn)樗矊?shí)現(xiàn)了服務(wù)契約。
來(lái)段代碼:
- 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ù)器收到消息的時(shí)間是:{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);
- }
- }
- }
以上就是我們對(duì)WCF雙向通信的相關(guān)介紹。