一、概述

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

二、请求与答复模式

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

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

       /// <summary>
/// 请求与答复模式,默认模式
/// </summary>
/// <param name="Id">书籍ID</param>
/// <returns></returns>
[OperationContract]
string GetBook(string Id);

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

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

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

  实例:

//服务端接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text; namespace WcfServiceLib
{ // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IBookService”。
[ServiceContract]
public interface IBookService
{
/// <summary>
/// 请求与答复模式,默认模式
/// </summary>
/// <param name="Id">书籍ID</param>
/// <returns></returns> [OperationContract]
string GetBook(string Id); } } //服务端实现
public class BookService : IBookService
{ public string GetBook(string Id)
{ System.Threading.Thread.Sleep();
int bookId = Convert.ToInt32(Id);
Books book = SetBook(bookId);
string xml = XMLHelper.ToXML<Books>(book);
return xml; } public Books SetBook(int Id)
{ Books book = new Books();
book.BookID = Id;
book.AuthorID = ;
book.Category = "IBM";
book.Price = 39.99M;
book.Numberofcopies = ;
book.Name = "DB2数据库性能调整和优";
book.PublishDate = new DateTime(, , );
return book; } } //客户端调用 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace WinClient
{ public partial class Form1 : Form
{ public Form1()
{ InitializeComponent();
} private void btnGetBook_Click(object sender, EventArgs e)
{ textBox1.Text += string.Format("开始调用wcf服务:{0}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
BookServiceReference.BookServiceClient client = new BookServiceReference.BookServiceClient();
string book = client.GetBook("");
textBox1.Text += book;
textBox1.Text += string.Format("\r\n调用结束:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); } } }

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

图1

图2

三、单向模式

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

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

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

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

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

  实例:

  //服务端接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text; namespace WcfServiceLib
{ // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IBookService”。
[ServiceContract]
public interface IBookService
{ /// <summary>
/// 请求与答复模式,默认模式
/// </summary>
/// <param name="Id">书籍ID</param>
/// <returns></returns>
[OperationContract]
string GetBook(string Id);
/// <summary>
/// 单工模式,显示名称
/// </summary>
/// <param name="name">书籍名称</param>
[OperationContract(IsOneWay = true)]
void ShowName(string name); }
} //服务端实现 using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text; namespace WcfServiceLib { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“BookService”。 // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 BookService.svc 或 BookService.svc.cs,然后开始调试。 public class BookService : IBookService
{ /// <summary>
/// 请求与答复模式,默认模式
/// </summary>
/// <param name="Id">书籍ID</param>
/// <returns></returns>
public string GetBook(string Id)
{
System.Threading.Thread.Sleep();
int bookId = Convert.ToInt32(Id);
Books book = SetBook(bookId);
string xml = XMLHelper.ToXML<Books>(book);
return xml;
} public Books SetBook(int Id)
{
Books book = new Books();
book.BookID = Id;
book.AuthorID = ;
book.Category = "IBM";
book.Price = 39.99M;
book.Numberofcopies = ;
book.Name = "DB2数据库性能调整和优";
book.PublishDate = new DateTime(, , );
return book;
} /// <summary>
/// 单工模式,显示名称
/// </summary>
/// <param name="name">名称</param>
public void ShowName(string name)
{
Console.WriteLine(string.Format("书籍名称:{0},日期时间{1}", name, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
} } } //客户端调用
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace WinClient
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void btnGetBook_Click(object sender, EventArgs e)
{ textBox1.Text += string.Format("开始调用wcf服务:{0}\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
BookServiceReference.BookServiceClient client = new BookServiceReference.BookServiceClient();
string book = client.GetBook("");
textBox1.Text += book;
textBox1.Text += string.Format("\r\n调用结束:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
} /// <summary>
/// 单工模式
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonOneWay_Click(object sender, EventArgs e) { textBox1.Text += string.Format("开始调用wcf服务:{0}\r\n\r\n", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
BookServiceReference.BookServiceClient client = new BookServiceReference.BookServiceClient();
client.ShowName("科学可以这样看丛书"); textBox1.Text += string.Format("\r\n\r\n调用结束:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
} } }

  在单向模式中与请求响应模式最主要的就是加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. ExtJS 4.2 业务开发(一)主页搭建

    本篇开始搭建一个ExtJS 4.2单页面应用, 这里先介绍主页的搭建,内容包括:主页结构说明.扩展功能等方面. 目录 1. 主页结构说明 2. 扩展功能 3. 在线演示 1. 主页结构说明 1.1 主 ...

  2. javascript中的事件冒泡和事件捕获

    1.事件冒泡 IE 的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档).以下面的HTML ...

  3. Xamarin+Prism开发详解二:Xaml文件如何简单绑定Resources资源文件内容

    我们知道在UWP里面有Resources文件xxx.resx,在Android里面有String.Xml文件等.那跨平台如何统一这些类别不一的资源文件以及Xaml设计文件如何绑定这些资源?应用支持多国 ...

  4. DDD 领域驱动设计-两个实体的碰撞火花

    上一篇:<DDD 领域驱动设计-领域模型中的用户设计?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新) 在 ...

  5. C#调用C++代码遇到的问题总结

    最近在开发服务后台的时候,使用c#调用了多个c++编写的dll,期间遇到了一系列的问题,经过一番努力最后都一一解决了,在此做个总结,方便以后参考,毕竟这些问题也都是很常见的,主要有以下问题: 类型对照 ...

  6. .NET面试题集锦①(Part一)

    一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.面向对象的思想主要包括什么? 答:任何事物都可以理解为对象,其主要特征: 继承.封装.多态.特点:代码好维护,安 ...

  7. Android开发学习—— Fragment

    #Fragment* 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容* 生命周期方法跟Activity一致,可以理解把其为就是一个Activity* 定义布局文件作 ...

  8. 【一起学OpenFOAM】03 OpenFOAM基本使用流程

    OpenFOAM初学者常常对于软件的使用流程感到很迷惑,与其他的具有GUI的CFD软件不同,OpenFOAM的所有操作均为基于文本操作,譬如说里面各种计算模型.计算参数.流程控制参数等,均为通过修改对 ...

  9. Fresnel Reflection - 菲涅尔反射

    [Fresnel Reflection - 菲涅尔反射] “菲涅尔”是一个人的名字,因为他发现了一个有关反射的光学现象,这个现象就用这个人的名字命名了.那么,是什么现象呢? 这就是反射/折射与视点角度 ...

  10. 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...