WCF的出现,给开发领域带来了不小的变化。那么如何才能正确的应用这一新的技术呢?在这里我们可以先从WCF双向通信的相关概念开始了解,以此来进一步加深我们对这一工具的了解程度。#t#
WCF整合了Remoting和webService等等。而且开发简单(相对的),它既弥补Remoting的只能在.net上运行,又弥补了asmx只能单向传送消息的缺点。也就是说,WCF是实现跨平台,在跨平台的同时,也可以双向通信。在WCF的编程思想中,无疑将SOA的思想体现的***。
首先要做的是就是定义服务契约。定义契约一般使用接口,使得实现和消费这个服务的双方都要按照这个契约来实现相应的接口。在双向通信中至少要定义两个服务,一个服务是供消费程序消费的,另一个则是在callBack的时候调用的服务,这个服务应该由消费程序实现。
其次,就是在服务端实现这些契约(说白了就是实现上面定义的接口)。在开发中,我们经常会把这个实现独立出来,方便在不同的宿主中发布这些服务。
***,实现客户端。在WCF双向通信中,客户端也是服务端,因为它也实现了服务契约。
来段代码:
- 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("服务器收到消息的时间是:{0}",
time.ToLongTimeString());- }
- #endregion
- }
- }
WCF双向通信调用服务:
- 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双向通信的相关介绍。