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 ...
随机推荐
- 性能优化(一个)Hibernate 使用缓存(一个、两、查询)提高系统性能
在hibernate有三种类型的高速缓存,我们使用最频繁.分别缓存.缓存和查询缓存.下面我们使用这三个缓存中的项目和分析的优点和缺点. 缓存它的作用在于提高性能系统性能,介于应用系统与数据库之间而存在 ...
- 开始 space viking 之旅
设备 cocos2d-v2 眼下cocos2d-v3也不太稳定,它在很大程度上仍然是变化的功能. 对于稳定.我们仍然使用 v2 wget -c http://cocos2d-iphone.goo ...
- WebBrowser控件的简单应用2
原文:WebBrowser控件的简单应用2 第一个简单应用里面讲述的是如何模拟调用当前网页的元素的事件或者赋值/取值.这次的应用讲述的是1:如何处理弹出新页面的事件(总是在我的浏览器里面现实新页面)2 ...
- poj3070--Fibonacci(矩阵的高速幂)
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9650 Accepted: 6856 Descrip ...
- 互联网点对点通讯(P2P)
摘自: http://www.cnblogs.com/zhili/archive/2012/09/14/p2p_pnpr.html 很遗憾,目前看了下代码,我测试只是做到了本地p2p. [C# 网络编 ...
- UITableView Cell 弹簧动画效果
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath ...
- css2与css3的区别
css2与css3的区别 CSS3引进了一些新的元素新的特性,我收集以下,自己做了一个小结: animation(基础动画)eg: div{animation: myfirst 5s linear ...
- Python - 字符串的替换(interpolation) 具体解释
字符串的插值(interpolation) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27054263 字符串的替换 ...
- 使用python的Flask实现一个RESTful API服务器端
使用python的Flask实现一个RESTful API服务器端 最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文 ...
- ASP.NET 5+EntityFramework 7
爱与恨的抉择:ASP.NET 5+EntityFramework 7 EF7 的纠缠 ASP.NET 5 的无助 忘不了你的好 一开始列出的这个博文大纲,让我想到了很久之前的一篇博文:恋爱虽易,相 ...