一、概述

  WCF在通信过程中有三种模式:请求与答复、单向、双工通信。以下我们一一介绍。

二、请求与答复模式

客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后,客户端才会继续向下执行,这种方式相对单向模式来说灵活性差,但是安全性高,因为是单线程的所以安全性极高,适用于有数据返回的请求。如下图所示(下图来自网络,图中的粗红线在此时代表顺序并不代表调用):

  请求与答复模式为WCF的默认模式,如下代码所示:

  1. /// <summary>
  2. /// 请求与答复模式,默认模式
  3. /// </summary>
  4. /// <param name="Id">书籍ID</param>
  5. /// <returns></returns>
  6. [OperationContract]
  7. string GetBook(string Id);

  只要是使用特性“[OperationContract]”即使返回值是void 也属于请求与答复模式。

  缺点:如果用WCF在程序A中上传一个2G的文件,那么要想执行程序B也许就是几个小时后的事情了。如果操作需要很长的时间,那么客户端程序的响应能力将会大大的下降。

  优点:有返回值我们就可以向客户端返回错误信息,如:只接收".rar"文件等信息。

  实例:

  1. //服务端接口
  2.  
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Runtime.Serialization;
  7. using System.ServiceModel;
  8. using System.Text;
  9.  
  10. namespace WcfServiceLib
  11. {
  12.  
  13. // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IBookService”。
  14. [ServiceContract]
  15. public interface IBookService
  16. {
  17. /// <summary>
  18. /// 请求与答复模式,默认模式
  19. /// </summary>
  20. /// <param name="Id">书籍ID</param>
  21. /// <returns></returns>
  22.  
  23. [OperationContract]
  24. string GetBook(string Id);
  25.  
  26. }
  27.  
  28. }
  29.  
  30. //服务端实现
  31. public class BookService : IBookService
  32. {
  33.  
  34. public string GetBook(string Id)
  35. {
  36.  
  37. System.Threading.Thread.Sleep();
  38. int bookId = Convert.ToInt32(Id);
  39. Books book = SetBook(bookId);
  40. string xml = XMLHelper.ToXML<Books>(book);
  41. return xml;
  42.  
  43. }
  44.  
  45. public Books SetBook(int Id)
  46. {
  47.  
  48. Books book = new Books();
  49. book.BookID = Id;
  50. book.AuthorID = ;
  51. book.Category = "IBM";
  52. book.Price = 39.99M;
  53. book.Numberofcopies = ;
  54. book.Name = "DB2数据库性能调整和优";
  55. book.PublishDate = new DateTime(, , );
  56. return book;
  57.  
  58. }
  59.  
  60. }
  61.  
  62. //客户端调用
  63.  
  64. using System;
  65. using System.Collections.Generic;
  66. using System.ComponentModel;
  67. using System.Data;
  68. using System.Drawing;
  69. using System.Linq;
  70. using System.Text;
  71. using System.Threading.Tasks;
  72. using System.Windows.Forms;
  73.  
  74. namespace WinClient
  75. {
  76.  
  77. public partial class Form1 : Form
  78. {
  79.  
  80. public Form1()
  81. {
  82.  
  83. InitializeComponent();
  84. }
  85.  
  86. private void btnGetBook_Click(object sender, EventArgs e)
  87. {
  88.  
  89. textBox1.Text += string.Format("开始调用wcf服务:{0}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  90. BookServiceReference.BookServiceClient client = new BookServiceReference.BookServiceClient();
  91. string book = client.GetBook("");
  92. textBox1.Text += book;
  93. textBox1.Text += string.Format("\r\n调用结束:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  94.  
  95. }
  96.  
  97. }
  98.  
  99. }

在上例中,我们在服务端让线程睡眠20秒然后再返回客户端,那么客户端两次显示当前时间的间隔必然在20秒以上,如下图1,2所示:

图1

图2

三、单向模式

单向模式顾名思义是一种单向的请求,客户端向服务端发出消息请求后客户端就和服务端失去了联系,请求的一端不会关心是否返回结果继续往下执行。也就是说客户端发送请求后就会向下继续执行,不会等待服务端返回消息,而且服务端接收消息并执行服务,这种单向的模式其实是一种多线程下的操作,客户端发出消息后, 客户端和服务端就会同时执行,这样它们之间就不会互相冲突,同时也是线程安全的,提高了执行效率。
       单向模式只需要在方法声明中添加IsOneWay属性即可,它即可表示该消息的调用使用的是单向模式。如下图所示:

  单向模式要在OpertaionContract的属性中显示设置值,代码如下:

  1. [OperationContract(IsOneWay = true)]
  2. void ShowName(string name);

  优缺点与“请求响应模式”差不多倒过来。

  特点:使用 IsOneWay=true 标记的操作不得声明输出参数、引用参数或返回值

  实例:

  1. //服务端接口
  2.  
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Runtime.Serialization;
  7. using System.ServiceModel;
  8. using System.Text;
  9.  
  10. namespace WcfServiceLib
  11. {
  12.  
  13. // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IBookService”。
  14. [ServiceContract]
  15. public interface IBookService
  16. {
  17.  
  18. /// <summary>
  19. /// 请求与答复模式,默认模式
  20. /// </summary>
  21. /// <param name="Id">书籍ID</param>
  22. /// <returns></returns>
  23. [OperationContract]
  24. string GetBook(string Id);
  25. /// <summary>
  26. /// 单工模式,显示名称
  27. /// </summary>
  28. /// <param name="name">书籍名称</param>
  29. [OperationContract(IsOneWay = true)]
  30. void ShowName(string name);
  31.  
  32. }
  33. }
  34.  
  35. //服务端实现
  36.  
  37. using System;
  38. using System.Collections.Generic;
  39. using System.Linq;
  40. using System.Runtime.Serialization;
  41. using System.ServiceModel;
  42. using System.Text;
  43.  
  44. namespace WcfServiceLib
  45.  
  46. {
  47.  
  48. // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“BookService”。
  49.  
  50. // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 BookService.svc 或 BookService.svc.cs,然后开始调试。
  51.  
  52. public class BookService : IBookService
  53. {
  54.  
  55. /// <summary>
  56. /// 请求与答复模式,默认模式
  57. /// </summary>
  58. /// <param name="Id">书籍ID</param>
  59. /// <returns></returns>
  60. public string GetBook(string Id)
  61. {
  62. System.Threading.Thread.Sleep();
  63. int bookId = Convert.ToInt32(Id);
  64. Books book = SetBook(bookId);
  65. string xml = XMLHelper.ToXML<Books>(book);
  66. return xml;
  67. }
  68.  
  69. public Books SetBook(int Id)
  70. {
  71. Books book = new Books();
  72. book.BookID = Id;
  73. book.AuthorID = ;
  74. book.Category = "IBM";
  75. book.Price = 39.99M;
  76. book.Numberofcopies = ;
  77. book.Name = "DB2数据库性能调整和优";
  78. book.PublishDate = new DateTime(, , );
  79. return book;
  80. }
  81.  
  82. /// <summary>
  83. /// 单工模式,显示名称
  84. /// </summary>
  85. /// <param name="name">名称</param>
  86. public void ShowName(string name)
  87. {
  88. Console.WriteLine(string.Format("书籍名称:{0},日期时间{1}", name, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
  89. }
  90.  
  91. }
  92.  
  93. }
  94.  
  95. //客户端调用
  96. using System;
  97. using System.Collections.Generic;
  98. using System.ComponentModel;
  99. using System.Data;
  100. using System.Drawing;
  101. using System.Linq;
  102. using System.Text;
  103. using System.Threading.Tasks;
  104. using System.Windows.Forms;
  105.  
  106. namespace WinClient
  107. {
  108. public partial class Form1 : Form
  109. {
  110. public Form1()
  111. {
  112. InitializeComponent();
  113. }
  114.  
  115. private void btnGetBook_Click(object sender, EventArgs e)
  116. {
  117.  
  118. textBox1.Text += string.Format("开始调用wcf服务:{0}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  119. BookServiceReference.BookServiceClient client = new BookServiceReference.BookServiceClient();
  120. string book = client.GetBook("");
  121. textBox1.Text += book;
  122. textBox1.Text += string.Format("\r\n调用结束:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  123. }
  124.  
  125. /// <summary>
  126. /// 单工模式
  127. /// </summary>
  128. /// <param name="sender"></param>
  129. /// <param name="e"></param>
  130. private void buttonOneWay_Click(object sender, EventArgs e)
  131.  
  132. {
  133.  
  134. textBox1.Text += string.Format("开始调用wcf服务:{0}\r\n\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  135. BookServiceReference.BookServiceClient client = new BookServiceReference.BookServiceClient();
  136. client.ShowName("科学可以这样看丛书");
  137.  
  138. textBox1.Text += string.Format("\r\n\r\n调用结束:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  139. }
  140.  
  141. }
  142.  
  143. }

  在单向模式中与请求响应模式最主要的就是加IsOneWay属性,运行效果如下图:

WCF学习之旅—请求与答复模式和单向模式(十九)的更多相关文章

  1. WCF学习之旅—第三个示例之三(二十九)

    上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...

  2. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  3. WCF学习之旅—实现支持REST客户端应用(二十四)

    WCF学习之旅—实现REST服务(二十二) WCF学习之旅—实现支持REST服务端应用(二十三) 在上二篇文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,及创建一个支持RES ...

  4. WCF学习之旅—TCP双工模式(二十一)

    WCF学习之旅—请求与答复模式和单向模式(十九) WCF学习之旅—HTTP双工模式(二十) 五.TCP双工模式 上一篇文章中我们学习了HTTP的双工模式,我们今天就学习一下TCP的双工模式. 在一个基 ...

  5. WCF学习之旅—HTTP双工模式(二十)

    WCF学习之旅—请求与答复模式和单向模式(十九) 四.HTTP双工模式 双工模式建立在上文所实现的两种模式的基础之上,实现客户端与服务端相互调用:前面介绍的两种方法只是在客户端调用服务端的方法,然后服 ...

  6. WCF学习之旅—第三个示例之五(三十一)

       上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九) WCF学习 ...

  7. WCF学习之旅——第一个WCF示例(一)

    最近需要用到WCF,所以对WCF进行了解.在实践中学习新知识是最快的,接下来先做了一个简单的WCF服用应用示例. 本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些 ...

  8. WCF学习之旅—WCF服务部署到IIS7.5(九)

    上接   WCF学习之旅—WCF寄宿前的准备(八) 四.WCF服务部署到IIS7.5 我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以 ...

  9. WCF学习之旅—TcpTrace工具(二十六)

    止文(WCF学习之旅—TcpTrace工具(二十五))介绍了关于TcpTrance的一种使用方式,接下来介绍第二种使用方式. 三.通过ListenUri实现基于tcpTracer的消息路由 对于路由的 ...

随机推荐

  1. 支持 .NET Core 的 Memcached 客户端 EnyimMemcachedCore

    1. 介绍 EnyimMemcachedCore 是一个支持 .NET Core 的 Memcached 客户端,是从 EnyimMemcached 迁移至 .NET Core的,源代码托管在 Git ...

  2. Taurus.MVC 2.0 开源发布:WebAPI开发教程

    背景: 有用户反映,Tausus.MVC 能写WebAPI么? 能! 教程呢? 嗯,木有! 好吧,刚好2.0出来,就带上WEBAPI教程了! 开源地址: https://github.com/cyq1 ...

  3. 实时的.NET程序错误监控产品Exceptionless

    Exceptionless可以对ASP.NET, Web API, WebForms, WPF, Console, 和 MVC 应用提供错误监控.上传.报表服务.使用时需要在Exceptionless ...

  4. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  5. Linux下Nodejs安装(完整详细)

    之前安装过windows下以及Mac下的node,感觉还是很方便的,不成想今天安装linux下的坑了老半天,特此记录. 首先去官网下载代码,这里一定要注意安装分两种,一种是Source Code源码, ...

  6. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

  7. 协议森林17 我和你的悄悄话 (SSL/TLS协议)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 转载请先与我联系. TLS名为传输层安全协议(Transport Layer Protocol),这个协议是一套加密的 ...

  8. 谈谈一些有趣的CSS题目(七)-- 消失的边界线问题

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  9. spring源码分析之@ImportSelector、@Import、ImportResource工作原理分析

    1. @importSelector定义: /** * Interface to be implemented by types that determine which @{@link Config ...

  10. PHP之使用网络函数和协议函数

    使用其他Web站点的数据 <html> <head> <title> Stock Quote From NASDAQ </title> </hea ...