随笔分类 - wcf
摘要:你说,服务器端回调有啥用呢?这样问,估计不好回答,是吧。不急,先讨论一个情景。假设现有服务器端S,客户端A开始连接S并调用相关操作,其中有一个操作,在功能上有些特殊,调用后无法即时回复,因为在服务器上要作一些后续,而这些处理也许会消耗一定时间,比如:向服务器上传了一个文件,但是,为了节约空间或出于其他目的,服务器要对刚上传的文件进行处理(压缩或者多媒体文件转码),这些操作无法马上向客户端回复,而客户端也不可能就停在这里一直在等。我们希望,在客户端上传文件后马上返回,而服务器对文件处理完成后再通知一下客户端。这样就引出一个东东——回调,E文叫Call Back。我估计用E文表述可能更好理解,Ca
阅读全文
摘要:在标题中我加了一个大家都很熟悉的单词——Session,熟吧?玩过Web开发的朋友肯定在梦中都会见到她。在Web中为什么要会话呢?毕竟每个用户在一个Web应用中可能不止进行一次操作,比如,某二手飞机交易网站,用户A登陆后,可能他会修改他的个人 信息,他也有可能看好了一架二手飞机,打算入手,就把商品放到他的“购物车”中,这些过程中,都会产生许多与用户A相关的数据,这些数据只是对A有效,而 当用户B登陆后,对于B,又会有他自己的数据,总的一句话就是,每个客户端在服务器上都有其的独立数据存储区,互不相干,就好像A和服务器在单独谈话一样,所以叫会话。在WCF中,会话的含义与Web中的会话概念是差不多的
阅读全文
摘要:我们知道,在WCF中,客户端对服务操作方法的每一次调用,都可以被看作是一条消息,而且,可能我们还会有一个疑问:如何知道客户端与服务器通讯过 程中,期间发送和接收的SOAP是什么样子。当然,也有人是通过借助其他工具来抓取数据包来查看。那,有没有办法让程序自己输出相应的SOAP信息呢?当然有,这就是我们本文要说的,对消息的拦截与篡改,呵,我用了一个不太好听动词——篡改。由于WCF的模型相对复杂,对于如何拦截和修改消息会让许多刚接触的朋友有点抓狂。是的,虽然MSDN文档都有详细的说明,但估计你也和我有相同的 感觉,看了MSDN的说明后依然一头雾水。确实如此,毕竟WCF不像窗口和控件那样可以看得见,理
阅读全文
摘要:在使用Socket/TCP来传输文件,弄起来不仅会有些复杂,而且较经典的“粘包”问题有时候会让人火冒七丈。如果你不喜欢用Socket来传文件,不妨试试WCF,WCF的流模式传输还是相当强大和相当实用的。因为开启流模式是基于绑定的,所以,它会影响到整个终结点的操作协定。如果你不记得或者说不喜欢背书,不想去记住哪些绑定支持流模式,可以通过以下方法:因为开启流模式,主要是设置一个叫TransferMode的属性,所以,你看看哪些Binding的派生类有这个属性就可以了。TransferMode其实是一个举枚,看看它的几个有效值: 1,Buffered:缓冲模式,说白了就是在内存中缓冲,一次调用就把.
阅读全文
摘要:Message翻译成中文,相信各位不陌生,是啊,就是消息,在WCF中也有消息这玩意儿,不知道你怎么去理解它。反正俺的理解,就像我们互发短信一个道理,通讯的双方就是服务器与客户端,说白了吧,就是二者之间的通信。我们知道一个WCF服务,先是定义服务协定,而服务协定中会有若干个服务操作协定(OperationContract),是这样吧?而所谓的操作协定,就是一个方法。于是,我的结论出来了,客户端与服务器端通信,每调用一回操作协定就相当于发送/接收一条消息,你干脆理解为一个OperationContract就是一条Message,哈,这样应该好接受了吧。之前的文章中,我们吹了修改SOAP头相关的技术
阅读全文
摘要:在WCF中,服务器与客户端的通讯有单向(单工)和双向(双工)之分。要说有什么形式上的表现,那就是单向与双向生成的SOAP不同,咱们先放下代码不说。但通常情况下,我们也不太需要去研究生成的SOAP是啥样子 的,因为这些都是不需要我们动手的,我们也不必要精通它,没实际用途,你把SOAP玩透了,妹子也不会说你牛B的,我们只需知道某些概念的存在即可。虽然单向与双向通讯没有UI,我们看不到,但我们有的是实验,为什么说学编程要常做实验,只有实验你才能获得书上学不到的知识。WCF在实验阶段,为了方便,反正原理我们弄懂了就行,我基本上是使用最简单 的“控制台应用程序”,主要是方便。为了便于实验,而且我们知道,
阅读全文
摘要:我们继续,上一回我们了解了数据协定的一部分内容,今天我们接着来做实验。好的,实验之前先说一句:实验有风险,写代码须谨慎。实验开始!现在,我们定义两个带数据协定的类——Student和AddrInfo。 [DataContract] public class Student { [DataMember] public string Name; [DataMember] public string Phone; [DataMember] public AddrInfo Address; } ...
阅读全文
摘要:在第4篇中,咱们了解了发送/接收SOAP头,从本篇开头,我们不妨更深入地去探求一下有关WCF中的消息到底是啥玩意儿。WCF庞大而复杂,而从 MSDN文档中,你会看到许多很专业很抽象的东西,你不禁会问,文档中所说的,是不是都有用的呢?实用的理论还是有的,不过有些要点确实太抽象了,抽象到 有时候我也不知道用来干吗?不过,数据协定应该算比较有用的东西,至少在你写WCF服务时还是会经常用到。我们先不管数据协定是什么,就从一个例子入手吧。1、以管理员身份运行VS,注意,要以管理员身份运行,不然等会儿可能启动不了服务器端。2、我们这个例子(解决方案)包含两个项目——服务器端和客户端。3、为了简单起键,我都
阅读全文
摘要:如果你实在不明白Header是个啥玩意儿,你就想一想你发送电子邮件时,是不是有个叫“附件”的东东?对啊,那么SOAP头是不是可以理解为一种附加信息?就是附加到消息正文的内容。消息正文又是啥?WCF除了流模式传输数据外,剩下的基本来说就是消息模式。我们不妨这样理解,WCF的服务器端和客户端是通过消息来交互的,就像 我们之间在发短信一样,我发给你,你可以回复我,这叫“双工”,不好读吧,叫双向好了;你心情不好的时候,可以不回我短信,这叫“单工”,还是不好听,叫 单向吧。对于“消息”,更NB一点的理解就是:客户端每调用一次服务器方法,就是向服务器发送一条消息。嗯,这个理解较为直观,是吧?先不管它专业不
阅读全文
摘要:我们知道,WCF服务端是先定义服务协定,其实就是一个接口,然后通过实现接口来定义服务类。那么,有一个问题,如果一个服务类同时实现N个接口(也就是有N个协定)呢?结果会如何?不必猜,我们还是通过实验来说明吧。首先,参照下面代码写好服务器端,代码中,我写了三个协定,然后一个服务类同时实现它们。using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using System.ServiceModel.Description;namespace
阅读全文
摘要:上一篇文章中,我们抛出了N个问题:WCF到底难不难学?复杂吗?如果复杂,可以化繁为简吗?其实,这些问题的答案全取决于你的心态,都说“态度决定一切”,这句话,不知道各位信不信,反正我是信了。首先,敢于挑战自我,乐于接受新事物的 人,就不会觉得有啥难学的,“世上有难事,只怕有心人”;再者,WCF当然复杂了,整个.NET框架都复杂,但不难学,因为.NET有一个先天性优点—— 集成性和统一性严重地好,这也是我乐于研究.NET的主要原因之一,复杂但不混乱。一个统一的国家总比一个四分五裂的国家要强大;第三,任何东西都可以化 繁为简,关键是你持什么样的心态。编程最高境界就是将程序和自然哲学等多种学术融为一体
阅读全文
摘要:WCF难学吗?是啊,这问题估计很多人都会问,也包括阿拉在内,也有此深刻而严重的凝问。也有人说:“如何某项技术可以化繁为简,学起来轻松一点就好了。”也许,人类开生就摆脱不了一种习性——懒惰;不过,也有人认为,很多时候,人们是不是总喜欢把简单的事情复杂化,那么,很多人都觉得很复杂的WCF算不算被人们“神话”了呢?这个问题,我不作回答,现在我们要做一件事,一起来跟着我的步骤,写一个程序再说。这个解决方案中包含两个项目,一个叫Server,另一个叫Client,天生一对。1、启动VS 2010,推荐用2010以上版本(2012 RC版也行),因为越高版本越好用,最好Express的,不要钱,我天天用。
阅读全文
摘要:ChannelFacTory对象主要用在中间层,目的是提高系统的性能,并且不需要每次都为每个客户端实例化一个新的代理对象。ChannelFactory类:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using Wrox.CarRentalService.Contracts;namespace Wrox.CarRentalService.ConsoleClient{ class Program { s...
阅读全文
摘要:一,创建自定义绑定有时候我们需要创建自己的绑定,这在很多情况下不是出于特殊的安全要求和使用的传输协议。为了创建自定义的绑定,需要建立一组绑定元素。绑定元素是由System.ServiceModel.Channels.BindingElement派生而来的。代码1,使用HTTP传输协议和Binary编码格式的自定义绑定: 除了用配置方式创建一个自定义绑定,也可以采用编程方式。代码2,用编程方式配置一个自定义绑定: class Program { static void...
阅读全文
摘要:我们经常会遇到这样的情形:访问服务的客户端可能来自各不相同的系统和应用程序。可以使用各不相同的绑定定义多个终结点,以允许不同的客户端平台用各自支持的传输协议来访问服务。显示声明多个绑定: 程序里增加了两个终结点,分别使用wsHttpBinding和basicHttpBinding。这里要注意:首先,绑定不同;其次,地址不同。此外,如果要使用另一个不同的契约,那么终结点可以使用同一个地址和同一个绑定。如果地址不唯一,契约相同,也会出现异常。2013-03-24
阅读全文