WCF读书笔记(3)

WCF的四大行为 契约行为(Contract Behavior),操作行为(Operation Behavior),服务行为(Service Behavior),终结点行为(Endpoint Behavior)。 如果把WCF看做是消息处理,对象激活与操作执行的管道,那么我们可以通过相应的行为来改变这个管道中某个环节的工作方式。比如加个密啊。什么的。 单向模式(One-Way) 单向模式不需要服务器执行后返回一个回复,多用于不要求服务执行后返回一个回复,并且能够容忍日志记录的失败,只有返回类型为void的才允许设置为true,同理,ref和out参数作为另一种类型的输出。也是不允许的。 WCF的三种异步操作 1.异步信道调用:客户端可以通过代理对象进行异步调用信道。 2.One-Way消息交换:单向的消息交换一旦抵达传输层,马上返回,从而实现异步 3.异步服务实现:服务端在具体实现服务操作的时候。采用异步调用的方式。 序列化: XMLSerializer序列化对象时,必须是公有,可读可写的属性,才能序列化。 WCF的四大契约 服务契约(Service Contract),数据契约(Data Contract),消息契约(Message Contract),错误契约(Fault Contract) 信道: 信道是为了便利WCF中客户端和服务的通信来设置的。ServiceHost为每个断点创建一个信道侦听器,侦听器产生通信通道,代理则产生一个信道发生器,发生器产生客户端的信道,两种信道相互兼容并且能有效处理之间的信息。 实际上,通信信道是有一个分层的信道栈组成-栈中的每一个信道都在消息处理过程中负责实施一个特定动作,信道栈包含一个传输信道,一个消息编码信道,和任意数量的消息处理信道,绑定则将决定了哪些信道留在信道栈中。当行为穿过信道栈时,消息处理方式将会有所改变。。

2012-09-08 · 1 min · bystander

WCF双工通信示例

 这两天在看WCF的书籍。就参考书上的代码写了这个例子。不得不说。书上有些错误的地方。。运行明显报错。改了一下。顺利通过。 先运行Hosting。然后运行Client。可以看到效果。不过不知道为什么会有如下的一个提示: 目标程序集不包含服务类型。可能需要调整此程序集的代码访问安全策略。 点击确定后并不影响程序运行。。但是也是个问题。。找了一下解决方法。都没有解决。。可能是我新建契约服务的时候,删掉了默认的IService配置。 //update:此问题解决了。是因为默认的app.config太多。对于典型的四层结构。需要删除契约和服务中的app.config。。 暂时先放着吧。 运行截图: 示例代码下载:Lazy.Duplex

2012-09-07 · 1 min · bystander

WCF读书笔记(2)

信道形状(Channel Shape) 用来表述不同的消息交换模式对消息交换双方信道(信息交换的管道)的不同要求,有什么IOutputChannel IReplyChannel IDuplexChannel之类的。。 对于IReplyChannel,服务器返回一个RequestContext类型,作为请求和回复之间的一道桥梁,可以获取也可以返回消息。 会话信道(Session Channel) 从状态保持的角度,信道可以分为两种类型,Datagram Channel和Session Channel,前者不和客户端绑定,后者可以识别客户端。 对于WCF的信道层来说,信道管理器在客户端和服务端扮演不同的角色。服务端的信道管理器用于监听来自客户端的请求,而客户端的信道仅仅是单纯创建用于请求发送和回复接收的信道,因此服务端的消息管理器又称为信道监听器(Channel Listener),客户端的信道管理器则称之为信道工厂(Channel Factory) 绑定元素(Binding Element) 构成一个绑定对象的元素,绑定实现了通信的所有细节,通过创建信道栈实现对消息的交换,系统绑定是指服务于某种类型场景的绑定元素的有序集合。 包括什么BaseHttpBinding之类的。 一个程序集包括元数据,中间语言代码,和资源。程序集已经加载,将一直保存在内存中,直到应用程序域卸载。最好摒弃添加服务引用的服务调用方式,而是直接将包含服务契约的程序集部署到客户端。客户端以直接创建代理的方式进行调用。 WCF可以看成是适配器,是CLR类型和XML两个不同世界的纽带。 依赖倒置原则:即抽象不应该依赖细节,细节应该依赖于抽象;即要针对接口编程,不要对实现编程。高层模块不应该依赖低层模块。两个都应该依赖抽象。 契约关心的是我能做到。而不在于我如何做到。 封送(Marshaling) 解决跨应用程序域对象访问的问题,需要采用一种特别的机制,那就是封送。分为按值封送和按引用封送 按值封送实现了跨应用程序域的数据共享 按引用封送则实现了跨应用程序域的远程调用。 如果一个程序员频繁的使用复制粘贴编程。那就意味着设计需要重构

2012-09-06 · 1 min · bystander

WCF读书笔记(1)

信道的分类:Transport Channel 信道 1.Message Encording Channel 2.Protocol Channel 信道管理器(Channel Manager),信道管理器用于信道栈的创建和生命周期的管理 1.ChannelListener 2.ChannelFactory WCF服务调用的两种典型方式 1.是借助代码生成工具svcUtil.exe导入元数据生成客户端代码和配置,添加服务引用采用的就是这种方式,工具会创建一个继承自Client的服务代理类型。 2.是通过ChannelFactory直接创建服务代理对象进行服务调用。 如果客户端已经进行了终结点的配置 那么通过信道工厂进行调用的代码大致如下: using(Channel<IService> channelFactory=new ChannelFactory<IService>("Service")) { IService ise=channelFactory.CreateChannel(); using(ise as IDisposable) { ise.MethodName(); } } WCF处理的是跨应用程序域,跨机器,跨网络的通信,所以WCF大多数时间进行网络传俗这样的IO操作,IO绑定的操作是采用异步编程(APM【Asynchronous Programming Model】) 消息交换模式MEP(Message Exchange Pattern) MEP定义了参与者进行消息交换的模板,代表一系列的模板,他们定了消息的发送者和接收者,相互进行消息传递的次序,比较典型的三种 1.Datagram 数据包模式,嘴尖的SEND/FORGET模式也叫One-Way模式,基于从一个源到另一个或多个目的地的单向消息传输,并不期待回复 消息报的发送可以分成三个模式,分别是单目的地模式,多投模式,广播模式。 依次接受方更强大。。 2.Request/Reply模式 使用最多的一种模式,请求期待回复。采用同步通信方式,但也可用于异步通信 3.Duplex 双工模式 双方可以互发消息,实现服务器回调客户端。订阅/发布是其中一种典型的实例,TCP可以提供原生的双工通信,WCF通过WSDualHttpBinding实现了基于Http的双工通信,实际上是采用两个HTTP通道实现

2012-09-05 · 1 min · bystander

超时时间已到,但是尚未从池中获取连接

 前段时间数据库的时候,出现这个问题。一般是读到20多万条的时候。会出现这个问题。 找了一下。主要是这两个问题: 一、看所有open的连接是否都close了。 二、如果访问量很大,加上Max Pool Size=512这一句,当然这是要以损失系统性能为代价的! 我查了一下。数据库连接所有的open都关闭了。 max pool size也确实加上了。但是。问题依旧。。 哦,还有的说在数据库连接字串中添加Connect Timeout=500,也就是设置连接超时更长一些。问题依旧。。 后来看到一篇文章中说: DataReader是独占连接 的,每个DataReader都要占用一个连接。当然这个情况是偶尔出现的,所以会很长时间出现一次,因为只有同时有超过连接池最大连接数量的并发操作才 会发生。而且你加大并发数量只能暂时缓解问题。 文中建议用使用dataset来读取。然后我就把读取数据中使用DataReader的地方全部用DataAdapter和DataSet来获取数据库数据,因为DataSet非独占。会将数据保存在内存中,一次连接后释放,问题解决。 记录一下。

2012-09-03 · 1 min · bystander

SqlServer 2008开启远程连接

 对于需要外部访问数据库的操作,需要开启sql server的远程连接。没经验的我等Google之。。大部分操作按照SQL Server 2008 R2如何开启数据库的远程连接来操作 但是。有一些很小的细节需要注意。我的数据库是Sql Server 2008 Express版。这个是VS自带的。为了管理方便,可以安装SQL Server® 2008 Management Studio Express 安装过程不多说。安装完成后,直接打开 服务器名称默认是空的。。“.”好像是不行的,这时候点击右边箭头。更多,本地和远程服务器。在远程服务器里可以找到。点击就可以了。 我按照文章改完。sa还是登不上。。然后又试了一些 如上图右键sa,属性,常规里设置sa密码。不要太简单。状态里的登录选项设为启用。ok。。我碰上的问题就这几个。

2012-08-20 · 1 min · bystander

C#调用Matlab引擎

 最近在使用matlab的时候。求多元函数取得最小值的时候。变量的值。于是就用到了sym符号。结果在C#中调用时总是出错。后来Google了N久发现是符号工具箱是无法编译的。。后来找到了替代方法。就是调用matlab 引擎。当然要稍微麻烦一点。因为调用引擎这种方法参数传递比较麻烦。我只想到了通过C#把需要计算的值保存到文本中。然后matlab中load进来。计算完成后 save出去。。 调用matlab引擎类似于在C#中新开了一个进程。然后执行一些命令。之前需要引用Matlab Application Type Library。这是个com组件 然后在程序里使用 using语句 using MLApp; 然后就可以正常使用了。使用我试过的有两种方法 MLApp.MLAppClass matlab = new MLApp.MLAppClass(); matlab.Visible = 1; string command="figure(1)"; matlab.Execute(command); matlab.Quit(); 很简单。Visible设置可见性。。command表示要执行的命令。 另一种是 MLApp.DIMLApp matlab = null; Type matlabAppType = System.Type.GetTypeFromProgID("Matlab.Application"); matlab = System.Activator.CreateInstance(matlabAppType) as MLApp.DIMLApp; matlab.Visible = 1; string command="figure(2)"; matlab.Execute(command); matlab.Quit(); 不知什么原因,第一种方法我没有调用成功。第二种调用成功。欢迎讨论。

2012-08-09 · 1 min · bystander

WPF实现控件拖动效果

首先很简单,当然是去添加两个控件了,这里我添加了两个控件,都是label,然后我想实现的是将label1拖动到label2上的时候,label1的内容会被复制到label2上。 <Label Content="TestDrop" Height ="28" HorizontalAlignment="Left" Margin="70,35,0,0" Name ="label1" VerticalAlignment="Top" MouseDown="label1_MouseDown" /> <Label Content ="ToHere" Height="28" HorizontalAlignment="Left" Margin ="342,107,0,0" Name="label2" VerticalAlignment="Top" AllowDrop ="True" Drop="tagert_drop" /> 需要注意的代码是label1中的MouseDown事件。和label2中的AllowDrop =“True” Drop=“tagert_drop” 然后对应的处理事件 private void label1_MouseDown(object sender, MouseButtonEventArgs e) { Label lbl = (Label )sender; DragDrop.DoDragDrop(lbl, lbl.Content, DragDropEffects .Copy); } private void tagert_drop(object sender, DragEventArgs e) { (( Label)sender).Content = e.Data.GetData(DataFormats.Text); } 其他的效果可以仿照这个来做。比如拖动以后的效果可以DragDropEffects来设置。。

2012-07-27 · 1 min · bystander

DevExpress DXperience Universal 12.1.5 破解补丁

 因为要用到wpf开发软件,而作为一个审美能力和制作美的能力完全不匹配的人。。需要有一个基本的主题框架来作为基础进行开发。。于是我找了找。。刚开始找的是http://www.telerik.com/这个商业库,不过这个用的不太顺手,于是还是试试DevExpress,,果断很不错,找到了破解补丁。 给一个官方的Demo示例图: 安装文件:DXperience-12.1.5安装包 帮助文档:DXperience 12.1.5 Universal 帮助文档: 破解补丁:DevExpress.Registration.Setup.v12.1.5.E3.msi

2012-07-21 · 1 min · bystander

未能加载文件或程序集“App_Web_xxxx”

 今天在用WCF写服务的时候,服务一直连不上,直接查看svc文件,发现如下错误 未能加载文件或程序集“‘App_Web_****, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",****是一个随机字符串。 解决方法中: 在web.config里配置成这样子: <compilation debug="true" batch="false"> 就好了。中午和下午一直在搞javascript连接WCF的demo,总算是晚上搞定了,,还是老样子,,最大的体会就是很多东西就是看着简单,写起来会有各种各样的问题,比如这次,即使照着微软的官方文档来,也会有错误。动手才是王道,不管做什么。这几天忙完了,写篇文章出来。 最后分享一下微软官方的WCF与Ajax开发实践系列课程,我只能说WCF这东西没有哪一本书比微软官方的技术培训讲的更好了,非常建议学习。 武汉最近下雨了,天气挺凉爽,过几天准备回家吧。。

2012-07-14 · 1 min · bystander