WCF三种通信模式(转)

一、概述

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

二、请求与答复模式

  描述:

  客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务端有了答复后才能继续执行其他程序,如下图所示(图中的粗红线在此时代表顺序并不代表调用):

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

1         [OperationContract]
2         string ShowName(string name);

  即使返回值是void 也属于请求与答复模式。

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

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

  实例:

复制代码
 1 //服务端接口
 2 using System.ServiceModel;
 3 
 4 namespace WCFService_Default
 5 {
 6     [ServiceContract]
 7     public interface IUser
 8     {
 9         [OperationContract]
10         string ShowName(string name);
11     }
12 }
13 //服务端实现
14 namespace WCFService_Default
15 {
16     public class User : IUser
17     {
18         public string ShowName(string name)
19         {
20             //线程睡眠20秒钟
21             System.Threading.Thread.Sleep(20000);
22             return "WCF服务,显示名称:" + name;
23         }
24     }
25 }
26 
27 //客户端调用
28 using System;
29 using WCFClient_Default.WCFService_Default;
30 
31 namespace WCFClient_Default
32 {
33     class Program
34     {
35         static void Main(string[] args)
36         {
37             UserClient client = new UserClient();
38             Console.WriteLine(DateTime.Now);
39             string result = client.ShowName("李林峰");
40             Console.WriteLine(result);
41             Console.WriteLine(DateTime.Now);
42             Console.ReadLine();
43         }
44     }
45 }
复制代码

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

二、单向模式

  描述:

  客户端向服务端发送求,但是不管服务端是否执行完成就接着执行下面的程序。如下图所示:

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

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

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

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

  实例:

复制代码
 1 //服务端接口
 2 using System.ServiceModel;
 3 
 4 namespace WCFService_OneWay
 5 {
 6     [ServiceContract]
 7     public interface IUser
 8     {
 9         [OperationContract(IsOneWay = true)]
10         void DoSomething();
11     }
12 }
13 
14 //服务端实现
15 namespace WCFService_OneWay
16 {
17     public class User : IUser
18     {
19         public void DoSomething()
20         {
21             //线程睡眠20秒钟
22             System.Threading.Thread.Sleep(20000);
23         }
24     }
25 }
26 
27 //客户端调用
28 using System;
29 using WCFClient_OneWay.WCFService_OneWay;
30 
31 namespace WCFClient_OneWay
32 {
33     class Program
34     {
35         static void Main(string[] args)
36         {
37             UserClient client = new UserClient();
38             Console.WriteLine(DateTime.Now);
39             //调用WCF服务的方法
40             client.DoSomething();
41             Console.WriteLine(DateTime.Now);
42             Console.ReadLine();
43         }
44     }
45 }
复制代码

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

三、双工模式

  描述:

  双工模式建立在上面两种模式的基础之上,实现客户端与服务端相互的调用。相互调用:以往我们只是在客户端调用服务端,然后服务端有返回值返回客户端,而相互调用不光是客户端调用服务端,而且服务端也可以调用客户端的方法。如下图所示:

  在上图中,客户端的程序A调用服务端的程序A,服务程序A执行完成前又调用客户端的程序D,然后再返回到程序A,图有点乱,其实就是为了说明“服务端”与“客户端”可以相互调用,下面直接看代码。

  如我们所说的,双工模式是建立在以上两种模式之上的模式,他们并不冲突,代码如下:

复制代码
 1     [ServiceContract(CallbackContract = typeof(IUserCallback))]
 2     public interface IUser
 3     {
 4         [OperationContract]
 5         string ShowName(string name);
 6     }
 7    //回调的接口 
 8     public interface IUserCallback
 9     {
10         [OperationContract(IsOneWay = true)]
11         void PrintSomething(string str);
12     }
复制代码

  实例:

  支持回调的绑定有4种:WSDualHttpBinding、NetTcpBinding、NetNamedPipeBinding、NetPeerTcpBinding。我们这里用WSDualHttpBinding为例

复制代码
 1 //配置文件中的 binding 指定
 2 <endpoint address=""  binding="wsDualHttpBinding" contract="WCFService_DualPlex.IUser"></endpoint>
 3 
 4 //服务端接口
 5 using System.ServiceModel;
 6 
 7 namespace WCFService_DualPlex
 8 {
 9     [ServiceContract(CallbackContract = typeof(IUserCallback))]
10     public interface IUser
11     {
12         [OperationContract]
13         string ShowName(string name);
14     }
15 
16     public interface IUserCallback
17     {
18         [OperationContract(IsOneWay = true)]
19         void PrintSomething(string str);
20     }
21 }
22 
23 //服务端实现
24 using System.ServiceModel;
25 
26 namespace WCFService_DualPlex
27 {
28     public class User : IUser
29     {
30         IUserCallback callback = null;
31 
32         public User()
33         {
34             callback = OperationContext.Current.GetCallbackChannel<IUserCallback>();
35         }
36 
37         public string ShowName(string name)
38         {
39             //在服务器端定义字符串,调用客户端的方法向客户端打印
40             string str = "服务器调用客户端...";
41             callback.PrintSomething(str);
42             //返回服务端方法
43             return "WCF服务,显示名称:" + name;
44         }
45     }
46 }
47 
48 //客户端调用
49 using System;
50 using System.ServiceModel;
51 using WCFClient_DualPlex.WCFService_DualPlex;
52 
53 namespace WCFClient_DualPlex
54 {
55     //实现服务端的回调接口
56     public class CallbackHandler : IUserCallback
57     {
58         public void PrintSomething(string str)
59         {
60             Console.WriteLine(str);
61         }
62     }
63 
64     class Program
65     {
66         static void Main(string[] args)
67         {
68             InstanceContext instanceContext = new InstanceContext(new CallbackHandler());
69             UserClient client = new UserClient(instanceContext);
70             Console.WriteLine(DateTime.Now);
71             string result = client.ShowName("李林峰");
72             Console.WriteLine(result);
73             Console.WriteLine(DateTime.Now);
74             Console.ReadLine();
75         }
76     }
77 }
复制代码

  在上例中,我们把接口定义在服务端,而实现在客户端,配置文件是由IDE自动生成的,我们在服务端ShowName方法中,调用了PringSomething的方法,实现了服务端向客户端的调用。  

  执行效果如下图所示:

四、代码下载:

  10 WCF 教程

转载于:https://www.cnblogs.com/wujy/archive/2013/04/08/3007385.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python语言打印菱形_Python打印菱形

使用python打印出菱形&#xff1a;*************************思想&#xff1a;平常我写这种代码的时候&#xff0c;总是自然地使用二层循环&#xff0c;今天老师教了一个特别好的方法&#xff0c;化二维为一维。我觉得代码优化是很重要的&#xff0c;所以把它写下来&#xff0c…

计算机软件及应用stata,蒙特卡洛模拟及其Stata应用实现

蒙特卡洛模拟及其Stata应用实现出版时间&#xff1a;2015年版丛编项&#xff1a;海南大学经济管理系列丛书内容简介《蒙特卡洛模拟及其Stata应用实现》的第1章是Stata软件基础&#xff0c;主要介绍了Stata软件的一些基本功能与操作。第2章介绍了Stata软件的语法结构&#xff0c…

第一个程序,Hello World

在eclipse里新建一个project&#xff0c;选Android-Android Project 然后Next,继续 解释一下 Package Name&#xff1a;这个学过编程的人都应该熟悉了&#xff0c;类似于namespace&#xff0c;你定义的所有东西都在一个包里不会和别的包出现重命名的问题等等&#xff0c;不多说…

Hadoop2.6集群动态添加和删除数据节点

2019独角兽企业重金招聘Python工程师标准>>> 开始之前&#xff0c;应该把所有新增数据节点上的Hadoop环境都配置好&#xff08;如果要直接复制已经存在节点的hadoop文件夹&#xff0c;应该删掉里面已经产生的集群数据&#xff0c;比如tmp和data目录&#xff0c;不然…

读操作系统的设计与实现--进程互斥

1.竞争条件 当两个或多个进程读写某些共享数据时&#xff0c;而最后的结果取决于进程的运行顺序时&#xff0c;这就称为竞争条件。包含竞争条件的程序&#xff0c;大多数时候运行结果良好&#xff0c;但是往往会发生一些无法解释的结果。事实上&#xff0c;只要涉及到共享资源的…

拉取ftp服务器上的文件_winscp和云服务器,2步实现winscp将文件上传到腾讯云Linux云服务器...

WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协议&#xff0c;它的主要功能就是在本地与远程计算机间安全的复制文件。与使用FTP上传代码相比&#xff0c;通过WinSCP可以直接使用服务器账户密码访问云服务器&#xff0c;无需在服务器端做任何配置。II…

计算机技术qq交流群,专业计算机群QQ

我想学习计算机的程序没什么基础 应该怎么做学什么 要怎么样才可以学好楼上的说得不对,直接学C就可以了,C不用学得太深,学些基本语法,然后转学C,因为C是面向对象的编程思想,把C的基础编程弄明白以后,可以从Visual C,C#,C。Net中选一项来学,先学些基础的,然后做些小项目,然后可以…

笔记:设计模式(3)-Abstract Factory抽象工厂模式

工厂模式的起源 1.变化点在“对象的创建”&#xff0c;因此就封装“对象创建”&#xff1b; 2.面向接口编程&#xff0c;依赖接口&#xff0c;而非依赖实现。 动机&#xff08;Motivation&#xff09; 在系统中&#xff0c;经常面临着“一系列相互以来的对象”的创建工作&#…

MongoDB操作:insert()

2019独角兽企业重金招聘Python工程师标准>>> Override public boolean inSert(String dbName, String collectionName, String[] keys,Object[] values) { DB db null; DBCollection dbCollection null; WriteResult result null; String resul…

python文件批量改名_python文件批量重命名

python文件批量重命名代码如下&#xff1a;# -*- coding: gbk -*-import osclass fileRename():def __init__(self, path):self.__path pathself.__order {}self.__files os.listdir(path)def list(self):return self.__filesdef presolve(self, string):for _ in string.sp…

内存管理简介之Buddy算法和slab分配

1.Buddy算法linux对空闲内存空间管理采取buddy算法&#xff0c;Buddy算法&#xff1a;把内存中所有页面按照2^n划分&#xff0c;其中n0~5&#xff0c;每个内存空间按1个页面、2个页面、4个页面、8个页面、16个页面、32个页面进行六次划分。划分后形成了大小不等的存储块&#x…

人工操作阶段计算机是如何工作的,管理信息系统作业参考答案

(一)、单项选择题1. 系统实施阶段的主要内容之一是(A)。A.系统物理配置方案的设计 B.输入设计C.程序设计 D.输出设计2. 结构化方法中&#xff0c;自顶向下原则的确切含义是(A)A 先处理上级机关事务&#xff0c;再处理下级机关事务B 先进行总体设计&#xff0c;后进行详细设计C …

最近处理的几个小问题_20160311

最近处理的小问题很多&#xff0c;我就拿出来几个&#xff0c;简单和大家说一说。我就分为三个方面&#xff0c;硬件问题&#xff0c;Oracle表空间迁移&#xff0c;MySQL断电恢复首先是硬件问题。如果看到下面的系统日志&#xff0c;就会发现早在2014年就出现了一些警告和问题&…

3. 什么是icmp?icmp与ip的关系_你知道如何跟女生,确定恋人关系吗?

哈喽&#xff01;同学你好&#xff01;我是子伯&#xff0c;是一名情感咨询。今天我想给你分享&#xff0c;和女生再暧昧期&#xff0c;如何去确定关系&#xff0c;因为......在我做咨询当中&#xff0c;有很多男生跟女生&#xff0c;不管是在聊天上&#xff0c;还是在线下的交…

量子计算机完整的图片,记者带你走近世界首台超越早期经典计算机的光量子计算机(组图)...

在光学体系方面&#xff0c;研究团队在去年首次实现十光子纠缠操纵的基础上&#xff0c;利用高品质量子点单光子源构建了世界首台超越早期经典计算机的单光子量子计算机。图为基于单光子的量子计算原型机结构。潘建伟教授供图据了解&#xff0c;多粒子纠缠的操纵作为量子计算的…

当Grid的数据源是View时,如何使用PeopleSoft自带的Save Function?

当Grid的数据源是View时&#xff0c;如何使用PeopleSoft自带的Save Function&#xff1f; 当Grid的数据源是一个View的时候&#xff0c;直接使用PeopleSoft自带的Save Function会显示错误&#xff0c;因为View是不可以执行Update的。在这种情况下&#xff0c;如果想使用PeopleS…

同批号不同批次同一单据中出现数量不限制

由于同一单据中XSAYMA00040259出现了同一批号不同批次的同一品种B200416 没有得到数量限制导致数量出现负数现进行更新update sphwph set shlshl700 where spidSPH00003434 and hwHWI00000002 and piciJHAYMA00010167_3update sphwph set shlshl-700 where spidSPH00003434 and…

编程题:“丑数”

今天看剑指offer的时候碰到了“丑数”这个问题&#xff0c;说这个“丑数”&#xff0c;常规的情况是&#xff0c;一般人碰到这个问题会感觉到无从下手&#xff0c;为什么呢&#xff1f;因为从一般人的角度来看&#xff0c;比如2乘以2.3.5分别为4、6、10,3乘以2.3.5的话为6、9、…

qtreewidget点击空白处时取消以选项_VUE+elementUI 点击页面空白处弹窗不隐藏

点击空白处不隐藏弹窗&#xff0c;点击弹窗里的‘x’和取消按钮关闭弹窗。os&#xff1a;人家都是让点击空白处隐藏弹窗&#xff0c;为啥我们的需求有点另类&#xff1f;&#xff01;木有办法~大佬有需求&#xff0c;小小程序员只能领命。。。话说&#xff0c;element的el-dial…

漂浮的表单

代码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Content-Typ…