WCF双工学习笔记
WCF双工的作用在于服务端执行某个方法的时候调用客户端的方法,有点类似委托的感觉,实际项目中在什么情况下使用还没想到。
WCF双工支持两种bind,一是nettcp、另一个是wsDualHttp,这里只说netTcp的双工。
和普通的WCF通信一样,
首先创建契约,
1、回调函数契约
[ServiceContract] public interface ICallback { [OperationContract(IsOneWay = true)] void DisplayResult(double result); }
注意:这里的IsOneWay必须是true,否则会报死锁的错误。IsOneWay 属性可以指示操作不返回答复消息,下面写到服务实现的时候会说到为何会出现死锁错误。
2、服务契约
[ServiceContract(CallbackContract=typeof(ICallback))] public interface ICalculator { [OperationContract(IsOneWay = false)] double Add(double x, double y); }
注意:[ServiceContract(CallbackContract=typeof(ICallback))] 这里表示要调用的回调函数是哪个契约
契约完成后,回调客户端的实现和服务的实现
1、回调函数客户端
public class CalculatorCallback : ICallback { public void DisplayResult(double result) { result = result + ; } }
2、服务
public class WCalculatorService : ICalculator { public double Add(double x, double y) { double result = x + y; ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>(); callback.DisplayResult(result); //这里调用回调函数 return result; } }
服务很简单,计算两个数相加,然后调用回调函数。回调函数是写在客户端Client上的,这里就是一个服务端调用客户端方法,这也就是双工。
大家看看这里result返回的是什么值?x+y还是x+y+1?
这里返回的是x+y,如之前说的,双工有点像委托,委托之后他就往下执行,并不管你在委托的方法中做了什么东西。
这里引用别人的博客来解释为什么会出现死锁,如果 IsOneWay 属性设置为 false(默认值),即使返回 void 的方法也会生成答复消息。在此种情况下,基础结构将创建并发送一条空消息,以向调用方指示该方法已返回内容。(使用此方法使基础结构可以将 SOAP 错误发送回客户端。)将 IsOneWay 设置为 true 是取消创建和调度响应消息的唯一方法。
究其本质,这是一个死锁导致的异常,由于默认的情况是服务的执行按Single并发模式进行,也就是说在服务执行全程,服务对象只能被一个线程访问。WCF通过加锁机制保证服务对象的独占性使用,也就是说在服务执行开始会对服务对象加锁,该锁在服务操作结束之后释放。
服务采用请求-回复模式的回调,服务端会一直等待回调操作的返回。而另一方面,当回调操作在客户端正常执行后,回到服务端试图访问服务操作的时候,发 现对象被服务操作执行的线程锁住,所以它会等待服务操作的执行完成后将锁释放。这样,服务操作需要等待回调操作进行正常返回以便执行后续操作,而回调操作 只有等待服务操作执行完毕将锁释放才能得以返回,从而形成了死锁。
这个本人不太理解服务按Single并发模式进行,留着后面再看。接着说双工,
这里我们已经有契约、回调函数、服务,只剩客户端和页面的调用了
1、客户端
public class Calculator : DuplexClientBase<ICalculator>, ICalculator { public Calculator(InstanceContext callbackInstance) : base(callbackInstance) { } public double Add(double x, double y) { return this.Channel.Add(x, y); } }
注意:这里我们使用DuplexClientBase来支持双工,DuplexClientBase类需要一个参数的构造方法,InstanceContext就是服务类的OperationContext,这里要赋值给他。
2、页面
protected void Page_Load(object sender, EventArgs e) { Calculator client = new Calculator(new InstanceContext(new CalculatorCallback())); , ); Response.Write(dou.ToString()); }
这里创建Calculator,new一个回调函数来创建InstanceContext,告诉服务我们的回调类。
还有一个配置文件的代码
1、Client
<client> <endpoint address="net.tcp://localhost:4503/service/CalculatorService.svc" binding="netTcpBinding" bindingConfiguration="" contract="WCFIContract.ICalculator" name="defaultEndpoint"/> </client>
2、Service
<services> <service name="WCFService.WCalculatorService"> <endpoint address="net.tcp://localhost:4503/service/CalculatorService.svc" binding="netTcpBinding" contract="WCFIContract.ICalculator" /> </service> </services>
接下来会记录一篇net.tcp协议寄宿到IIS的学习笔记,配置文件的解释打算放在这篇笔记中。
一个简单的双工例子,自己记录一下,这只是一篇学习文章,提供了解交流,没有权威性,欢迎指正。
共勉
WCF双工学习笔记的更多相关文章
- WCF揭秘学习笔记(1):基础知识
最近找工作,面试时经常被问懂不懂WCF.不少招聘高级.NET工程师的要求上都 写着有WCF开发经验的优先考虑.我对于WCF仅仅是通过看一些教学视频这种山寨学习法了解一些.现在要下决心好好学习一下WCF ...
- WCF双工通信笔记
1,Dupex(双工) MEP(消息交换模式),服务端回调(Callback)客户端操作 2,客户端调用服务时,附加上一个回调对象(InstanceContext).服务端处理服务请求时,通过该回调对 ...
- WCF揭秘学习笔记(5):WF定制活动
WF(Windows Workflow Foundation,Windows工作流基础)为.NET提供了一种基于模型的.声明方式的过程执行引擎,它改变了传统的通过一行行编写代码来开发服务功能的方式. ...
- WCF揭秘学习笔记(4):可信赖会话、会话管理、队列、事务
可信赖会话 WCF的可信赖会话在绑定层保证消息只会被传输一次,并且保证消息间的顺序.当使用TCP通信时,协议本身保证了可靠性,但它只在两点间的网络 包这个层面提供了这样的保证.WCF的可信赖会话特性保 ...
- WCF揭秘学习笔记(3):使用DataContractSerializer
使用DataContractSerializer 终结点(包括地址.绑定.契约)可通过代码以编程方式添加到服务中.如: using(ServiceHost host =new ServiceHost( ...
- WCF揭秘学习笔记(2):数据表示
背景知识 WCF提供了一种语言为软件通信建模,称作服务模型.使用更底层的编程架构提供的类可以从这种语言建立的模型中生成可用的通信软件. 在服务模型使用的语言中,负责通信的软件部分称为服务(servic ...
- WCF 学习笔记之双工实现
WCF 学习笔记之双工实现 其中 Client 和Service为控制台程序 Service.Interface为类库 首先了解契约Interface两个接口 using System.Service ...
- Dynamic CRM 2013学习笔记(二十二)插件里调用WCF服务
1. 添加service: 2.调用WCF BasicHttpBinding myBinding = new BasicHttpBinding(); myBinding.Name = &q ...
- WCF学习笔记之事务编程
WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...
随机推荐
- 透过【百度地图API】分析双闭包问题
原文:透过[百度地图API]分析双闭包问题 摘要: 有位API爱好者问到,昨天的教程里为什么不使用for循环?他使用for循环后,也发现代码无效.这是什么原因? ------------------- ...
- [CLR via C#]1.5 本地代码生成器:NGen.exe
原文:[CLR via C#]1.5 本地代码生成器:NGen.exe 1. NGen.exe工具,可以在一个程序安装到用户计算机时,将IL代码编译成为本地代码.由于代码在安装时已经编译好,所以CLR ...
- WSockExpert[抓包工具]
一.WSockExpert简单介绍 WSockExpert是一个抓包工具,它能够用来监视和截获指定进程网络数据的传输,对測试站点时非常实用.在黑客的手中,它经常被用来改动网络发送和接 ...
- 国内首篇介绍JanOS物联网操作系统的文章 - 如何把你的手机主板打造成物联网平台
天地会珠海分舵注:如无意外,您现在正在看的将是国内首篇且是唯一一篇介绍炙手可热的物联网的操作系统JanOS的文章!不信你去百度!希望大家能喜欢.但本文只是引言,更多信息请还是访问JanOS的官网:ht ...
- SQL点滴31—SQL语句中@@IDENTITY和@@ROWCOUNT区别
原文:SQL点滴31-SQL语句中@@IDENTITY和@@ROWCOUNT区别 SQL语句中@@IDENTITY和@@ROWCOUNT区别 在一条 INSERT.SELECT INTO 或大容量复制 ...
- selenium2入门 定位 窗体切换等等 (二)
定位用的html素材有两个 demo.html <html> <head> <title>UI Automation Testing</title> & ...
- OCP-1Z0-051-题目解析-第3题
3. You need to extract details of those products in the SALES table where the PROD_ID columncontains ...
- js获取最近几天的日期(转载)
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- INNO SETUP卸载程序中加入自定义窗体
原文:INNO SETUP卸载程序中加入自定义窗体 [Setup] AppName=My Program AppVerName=My Program v.1.2 DefaultDirName={pf} ...
- mysql 安装后无法登陆mysql的 shell 那mysql>经验:ERROR 1045 (28000): Access denied for user 'root'@'localhost‘
[root@hzswtb2-mpc ~]# mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using pas ...