WCF双向通信实现服务契约
创始人
2024-06-17 10:40:38
0

WCF框架的出现,为我们解决了许多以前不能实现功能。那么对于WCF双向通信的具体含义又有多少人真正了解呢。在这里我们就来初步的探讨下WCF双向通信。#t#

WCF整合了Remoting和webService等等。而且开发简单(相对的),它既弥补Remoting的只能在.net上运行,又弥补了asmx只能单向传送消息的缺点。也就是说,WCF是实现跨平台,在跨平台的同时,也可以双向通信。在WCF的编程思想中,无疑将SOA的思想体现的***。

首先要做的是就是定义服务契约。定义契约一般使用接口,使得实现和消费这个服务的双方都要按照这个契约来实现相应的接口。在双向通信中至少要定义两个服务,一个服务是供消费程序消费的,另一个则是在callBack的时候调用的服务,这个服务应该由消费程序实现。

其次,就是在服务端实现这些契约(说白了就是实现上面定义的接口)。在开发中,我们经常会把这个实现独立出来,方便在不同的宿主中发布这些服务。

***,实现客户端。在WCF双向通信中,客户端也是服务端,因为它也实现了服务契约。

  1. Contract:  
  2. namespace Lin.Contract  
  3. {  
  4. [ServiceContract(CallbackContract=
    typeof(ICallBack))]  
  5. public interface IHello  
  6. {  
  7. [OperationContract]  
  8. void SayHelloTo(string userName);  
  9. }  
  10. }  
  11. namespace Lin.Contract  
  12. {  
  13. [ServiceContract]  
  14. public interface ICallBack  
  15. {  
  16. [OperationContract]  
  17. void ReceiveTime(DateTime time);  
  18. }  
  19. }  
  20. Service:  
  21. namespace Lin.Service  
  22. {  
  23. [ServiceBehavior(ConcurrencyMode
    ConcurrencyMode = ConcurrencyMode
    .Reentrant)]  
  24. public class ServiceHello : IHello  
  25. {  
  26. IHello 成员#region IHello 成员  
  27. public void SayHelloTo(string userName)  
  28. {  
  29. Console.WriteLine("Hello {0}", userName);  
  30. OperationContext.Current.GetCallbackChannel
    ().ReceiveTime(DateTime.Now);  
  31. }  
  32. #endregion  
  33. }  
  34. }Host:  
  35. class Program  
  36. {  
  37. static void Main(string[] args)  
  38. {  
  39. using (ServiceHost host = 
    new ServiceHost(typeof(ServiceHello)))  
  40. {  
  41. host.Open();  
  42. Console.Read();  
  43. }  
  44. }  
  45. }Client:  
  46. namespace Lin.Client  
  47. {  
  48. public class ClientCallBack:ICallBack  
  49. {  
  50. ICallBack 成员#region ICallBack 成员  
  51. public void ReceiveTime(DateTime time)  
  52. {  
  53. Console.WriteLine("服务器收到消息的时间是
    :{0}", time.ToLongTimeString());  
  54. }  
  55. #endregion  
  56. }  
  57. }  
  58. 调用服务:  
  59. namespace Lin.Client  
  60. {  
  61. public class ClientHello : 
    DuplexClientBase, IHello  
  62. {  
  63. public ClientHello(InstanceContext 
    instance) : base(instance) { }  
  64. IHello 成员#region IHello 成员  
  65. public void SayHelloTo(string userName)  
  66. {  
  67. base.Channel.SayHelloTo(userName);  
  68. }  
  69. #endregion  
  70. }  
  71. }  
  72. class Program  
  73. {  
  74. static void Main(string[] args)  
  75. {  
  76. Hello();  
  77. Console.Read();  
  78. }  
  79. static void Hello()  
  80. {  
  81. ClientCallBack callBack = 
    new ClientCallBack();  
  82. ClientHello hello = 
    new ClientHello(new 
    InstanceContext(callBack));  
  83. string commandString = string.Empty;  
  84. while (commandString != "exit")  
  85. {  
  86. commandString = Console.ReadLine();  
  87. hello.SayHelloTo(commandString);  
  88. }  
  89. }  

如同OO的出现一样,有些人是注重OO的思想,有些人注重OO的实现。同样的,WCF双向通信应该更多的是提倡一种面向服务架构的思想。SOA如何实现,这个不重要,每个平台都有自己的实现方式。这也体现了技术要服务于社会。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...