WCF雙向通信實(shí)現(xiàn)服務(wù)契約
WCF框架的出現(xiàn),為我們解決了許多以前不能實(shí)現(xiàn)功能。那么對于WCF雙向通信的具體含義又有多少人真正了解呢。在這里我們就來初步的探討下WCF雙向通信。#t#
WCF整合了Remoting和webService等等。而且開發(fā)簡單(相對的),它既彌補(bǔ)Remoting的只能在.net上運(yùn)行,又彌補(bǔ)了asmx只能單向傳送消息的缺點(diǎn)。也就是說,WCF是實(shí)現(xiàn)跨平臺,在跨平臺的同時(shí),也可以雙向通信。在WCF的編程思想中,無疑將SOA的思想體現(xiàn)的***。
首先要做的是就是定義服務(wù)契約。定義契約一般使用接口,使得實(shí)現(xiàn)和消費(fèi)這個(gè)服務(wù)的雙方都要按照這個(gè)契約來實(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)這些契約(說白了就是實(shí)現(xiàn)上面定義的接口)。在開發(fā)中,我們經(jīng)常會把這個(gè)實(shí)現(xiàn)獨(dú)立出來,方便在不同的宿主中發(fā)布這些服務(wù)。
***,實(shí)現(xiàn)客戶端。在WCF雙向通信中,客戶端也是服務(wù)端,因?yàn)樗矊?shí)現(xiàn)了服務(wù)契約。
- Contract:
- 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(ConcurrencyMode
ConcurrencyMode = 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
- }
- }
- 調(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);
- }
- }
- }
如同OO的出現(xiàn)一樣,有些人是注重OO的思想,有些人注重OO的實(shí)現(xiàn)。同樣的,WCF雙向通信應(yīng)該更多的是提倡一種面向服務(wù)架構(gòu)的思想。SOA如何實(shí)現(xiàn),這個(gè)不重要,每個(gè)平臺都有自己的實(shí)現(xiàn)方式。這也體現(xiàn)了技術(shù)要服務(wù)于社會。