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 ...
随机推荐
- svnclient本地化和异常处理
svn中国本土化,首次安装client.然后下载语言包的相应版本,然后将语言设置为英文! 我碰到汉化失败的案例:client与语言包版本号不匹配 之前安装的语言包: 下载相应语言包: 假设之前安装了, ...
- hadoop编程小技巧(5)---自己定义输入文件格式类InputFormat
Hadoop代码測试环境:Hadoop2.4 应用:在对数据须要进行一定条件的过滤和简单处理的时候能够使用自己定义输入文件格式类. Hadoop内置的输入文件格式类有: 1)FileInputForm ...
- 用了TextMate才知道什么叫神级Editor
用了TextMate才知道什么叫神级Editor 一直用Eclipse作为开发Ruby和Java项目的IDE,但是太耗内存,再开个Firefox和虚拟机就可以直接将MBP弄残了..看到大家都对Mac下 ...
- 详细的图文介绍如何利用XAMPP本地建站的环境配置教程
原文:详细的图文介绍如何利用XAMPP本地建站的环境配置教程 WordPress 是一个简便快捷,用途广,人气旺的一个开源的博客建站程序.很有很多等您去发现. 简便快捷:在性能上易于操作.易于浏览: ...
- 2014牡丹江区域赛H(特里)ZOJ3826
Hierarchical Notation Time Limit: 2 Seconds Memory Limit: 131072 KB In Marjar University, stude ...
- C语言库函数大全及应用实例十四
原文:C语言库函数大全及应用实例十四 [编程资料]C语言库函数大全及应用实例十四 函数名: strset 功 能: 将一个串 ...
- Ubuntu终端字体颜色方案
默认: 蓝色代表该文件夹: 绿色代表可运行文件. 红色表示压缩文件. 浅蓝色表示链接文件: 灰色表示其它文件: 红色闪烁表示链接的文件有问题了 黄色表示设备文件. 非常不爽怎么办,改! # Attri ...
- QT Creater与libusb使用
新建一个C项目,然后修改.pro文件,添加LIBS一行 TEMPLATE = app CONFIG += console CONFIG -= app_bundle CONFIG -= qt LIBS ...
- leetcode第八题--String to Integer (atoi)
Problem: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible inp ...
- SQLServer 分组查询相邻两条记录的时间差
原文:SQLServer 分组查询相邻两条记录的时间差 首先,我们通过数据库中表的两条记录来引出问题,如下图 以上为一个记录操作记录的表数据.OrderID为自增长列,后面依次为操作类型,操作时间,操 ...