WCF雙向通信實現服務契約
WCF框架的出現,為我們解決了許多以前不能實現功能。那么對于WCF雙向通信的具體含義又有多少人真正了解呢。在這里我們就來初步的探討下WCF雙向通信。#t#
WCF整合了Remoting和webService等等。而且開發簡單(相對的),它既彌補Remoting的只能在.net上運行,又彌補了asmx只能單向傳送消息的缺點。也就是說,WCF是實現跨平臺,在跨平臺的同時,也可以雙向通信。在WCF的編程思想中,無疑將SOA的思想體現的***。
首先要做的是就是定義服務契約。定義契約一般使用接口,使得實現和消費這個服務的雙方都要按照這個契約來實現相應的接口。在雙向通信中至少要定義兩個服務,一個服務是供消費程序消費的,另一個則是在callBack的時候調用的服務,這個服務應該由消費程序實現。
其次,就是在服務端實現這些契約(說白了就是實現上面定義的接口)。在開發中,我們經常會把這個實現獨立出來,方便在不同的宿主中發布這些服務。
***,實現客戶端。在WCF雙向通信中,客戶端也是服務端,因為它也實現了服務契約。
- 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("服務器收到消息的時間是
:{0}", time.ToLongTimeString());- }
- #endregion
- }
- }
- 調用服務:
- 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的出現一樣,有些人是注重OO的思想,有些人注重OO的實現。同樣的,WCF雙向通信應該更多的是提倡一種面向服務架構的思想。SOA如何實現,這個不重要,每個平臺都有自己的實現方式。這也體現了技術要服務于社會。