摘要: 最近这两天一直在忙着为一个项目检查内存泄漏(Memory Leak)的问题,对相关的知识进行了一下简单的学习和探索,其间也有了一些粗浅的经验积累,今天特意写一篇相关的文章与大家分享。那些对内存泄漏稍微有点了解的人,对于本篇文章的标题,相信不会觉得是在危言耸听。就我查阅的资料,已经这两天的发现也证实了这一点:觉得部分的内存泄漏问题与事件(Event)有关。本篇文章将会介绍其原理,以及如何发现和解决由事件导致的内存泄漏问题。 阅读全文
posted @ 2009-12-03 21:02 Artech 阅读(17786) 评论(44) 推荐(22)
摘要: As discussed last time, delegates can produce memory leaks in our applications if not used carefully. Most often, this happens with events when we add a handler to an event, forget to remove it and the object on which the event is declared lives longer than the object that handles it. The following diagram illustrates the problem. 阅读全文
posted @ 2009-12-03 16:44 Artech 阅读(5489) 评论(2) 推荐(3)
摘要: Infragistics是全球领先的UI工具和用户体验的专家,Infragistics开发了一系列的炫目的Windows、Web、WPF和Silverlight控件,相信很多人在使用它们。我们现在的项目就在使用Infragistics的Windows Form控件集。虽然这些控件功能强大,也不可能满足你所有的需求,尤其是那些比较苛刻的最终用户的需求。比如,我们最近就接收到这样的需求:让所以菜单项、工具栏按钮、网格单元的ToolTip以气球式的样式显示。最终,我通过对现有控件的扩展实现这个要求。 阅读全文
posted @ 2009-12-02 22:41 Artech 阅读(5469) 评论(29) 推荐(3)
摘要: 上一篇文章主要讨论的是PetShop的模块划分,在这一篇文章中我们来讨论在一个模块中如何进行层次划分。模块划分应该是基于功能的,一个模块可以看成是服务于某项功能的所有资源的集合;层次划分侧重于关注点分离(SoC:Separation of Concern ),让某一层专注于某项单一的操作,以实现重用性、可维护性、可测试性等相应的目的。 阅读全文
posted @ 2009-12-01 19:57 Artech 阅读(8888) 评论(41) 推荐(13)
摘要: 在《WCF技术剖析(卷1)》的最后一章,我写了一个简单基于WCF的Web应用程序,该程序模拟一个最简单的网上订购的场景,所以我将其命名为PetShop。PetShop的目在于让读者体会到在真正的项目开发中,如何正确地、有效地使用WCF。在这个应用中,还会将个人对设计的一些总结融入其中,希望能够对读者有所启发。 阅读全文
posted @ 2009-11-30 19:22 Artech 阅读(17506) 评论(103) 推荐(28)
摘要: [From J.D. Meier's Blog]A final PDF is now available for our patterns & practices Application Architecture Guide, second edition. This is our platform playbook for the Microsoft application platform. 阅读全文
posted @ 2009-11-25 21:11 Artech 阅读(7170) 评论(36) 推荐(8)
摘要: 服务端只有抛出FaultException异常才能被正常地序列化成Fault消息,并实现向客户端传播。对于一般的异常(比如执行Divide操作抛出的DivideByZeroException),在默认的情况下,异常信息无法实现向客户端传递。但是,倘若为某个服务应用了ServiceDebugBehavior这么一个服务行为,并开启了IncludeExceptionDetailInFaults开关,异常信息将会原封不动地传播到客户端。WCF内部是如何处理抛出的非FaultException异常的呢? 阅读全文
posted @ 2009-11-24 18:45 Artech 阅读(5143) 评论(16) 推荐(5)
摘要: WCF客户端和服务端的框架体系相互协作,使得开发人员可以按照我们熟悉的方式进行异常的处理:在服务操作执行过程中抛出异常(FaultException),在调用服务时捕获异常,完全感觉不到“分布式”的存在,如同典型的“本地”操作一般。为了实现这样的效果,WCF在内部为我们作了很多。 阅读全文
posted @ 2009-11-23 22:59 Artech 阅读(3985) 评论(17) 推荐(6)
摘要: 从整个基础构架的层次结构上讲,WCF可以分成两个部分:服务模型层(Service Mode Layer)和信道层(Channel Layer)。服务模型层建立在信道层之上,提供了一个统一的、可扩展的编程模型。信道层则通过绑定(Binding)建创的信道栈为消息通信提供了一个传输、处理的通道。 阅读全文
posted @ 2009-11-21 21:34 Artech 阅读(13566) 评论(10) 推荐(8)
摘要: 在《WCF技术剖析(卷1)》写作期间,对WCF又有了新的感悟,为此以书名开始本人的第三个WCF系列。本系列的目的在于对《WCF技术剖析》的补充,会对书中的一些内容进行展开讲述,同时会囊括很多由于篇幅的原因忍痛割弃的内容。为了方便广大WCF爱好者的阅读,今天花了两个小时的时候对前一阵子撰写的《WCF技术剖析》系列博文(一共30篇)进行收集整理,将其发布出来与大家分享。 阅读全文
posted @ 2009-11-21 19:03 Artech 阅读(82068) 评论(84) 推荐(66)
摘要: Enterprise Library是微软P&P部门开发的众多Open source框架中的一个,最新的版本已经出到了4.1。由于接触Enterprise Library已经有很长的一段时间,在实际的项目中使用的频率也很高。对此有了一些积累,希望通过这个新的系列和广大网友一起分享和交流。本系列假设读者已经对Enterprise Library有一定的了解,故而不会对各个Application Block的基本原理和编程模型进行介绍,而把侧重点放在Enterprise Library深层次的实现原理、设计模式的应用、有效扩展和最佳实践上 阅读全文
posted @ 2009-11-21 18:12 Artech 阅读(14461) 评论(4) 推荐(9)
摘要: 在上篇中,我详细介绍了如何通过自定义ClientMessageInspector和ErrorHandler,实现WCF与微软企业库中的Exception Handling Application Block(EHAB)之间的集成。本篇中,我们对其加以改进,使你不需要再为每个操作应用相同的FaultContractAttribute。 阅读全文
posted @ 2009-11-18 20:49 Artech 阅读(3791) 评论(7) 推荐(2)
摘要: 在《WCF技术剖析(卷1)》的最后一章,我给出了一个具体的应用WCF的分布式应用实例,我把这个实例命名为PetShop。看过本书的读者,一定还记得我还通过WCF扩展实现了于微软企业库(Enterprise Library)异常处理应用块(Exception Handling Application Block:EHAB)的集成,现在我们可以详细来讲述这是如何实现的。 阅读全文
posted @ 2009-11-16 00:20 Artech 阅读(4713) 评论(23) 推荐(8)
摘要: 在[第2篇]中,我们深入剖析了单调(PerCall)模式下WCF对服务实例生命周期的控制,现在我们来讨轮另一种极端的服务实例上下文模式:单例(Single)模式。 阅读全文
posted @ 2009-11-10 00:11 Artech 阅读(5933) 评论(6) 推荐(10)
摘要: 在[上篇]中,我们介绍了WCF关于实例管理一些基本的知识点,包括InstanceContext、InstanceContextMode、已经如何通过ServiceBehaviorAttribute应用不同的实例上下文模式给不同的服务。在[第1篇]中,对WCF采用的三种不同实例上下文模式进行了简单的比较,本篇的重点方法对单调(PerCall)模式为进行详细介绍。 在单调(Per-Call)实例上下文模式下,WCF总是创建一个新的服务实例上下文处理接收到的每一个服务调用请求,并在服务操作执行结束后,回收服务上下文和服务实例。换句话说,单调服务实例上下文模式使服务实例上下文的生命周期与服务调用本身绑定。我们首先来介绍单调模式下服务实例上下文具体有怎样的生命周期。 阅读全文
posted @ 2009-11-09 00:04 Artech 阅读(5691) 评论(29) 推荐(10)
摘要: 最近,用户提出了一个要求:需要通过按键方式来控制容器控件竖直滚动条。具体来讲就是说,如果一个容器内容过多,用户可以通过按键PageUp和PageDown来控制上下的滚动。刚开始,我试图采用注册事件的方式来实现,但是效果不理想,一来是没有一个单一的地方来对所有相关空间进行事件注册操作,二来如果容器被子控件完全遮挡,容器空间的事件将不会正常出发。有个同事提示采用自定义MessageFilter的方式,我觉得可行,于是进行了一番尝试。 阅读全文
posted @ 2009-11-06 23:47 Artech 阅读(3629) 评论(10) 推荐(4)
摘要: HP QC(Quantity Center)是一款不错的测试管理工具,最近把公司的操作系统从Windows XP升级到Windows 7之后,发现登录到QC Server的Addin页面,很多客户端组件不能正常下载,从而导致整个QC不能使用。通过Google找到了解决方案,特发出来与大家共享,希望那些在Windows 7上使用HP QC的朋友遇到该问题的时候,能过及时得到解决。 阅读全文
posted @ 2009-11-06 11:15 Artech 阅读(15922) 评论(19) 推荐(3)
摘要: 服务调用的目的体现在对某项服务功能的消费上,而功能的实现又定义在相应的服务类型中。不论WCF服务端框架处理服务调用请求的流程有多么复杂,最终都落实在服务实例的激活和操作方法的执行上面。WCF中的实例管理(Instance Management)旨在解决服务实例的激活和服务实例生命周期的控制上。对实例管理合理利用,对于改善和提高WCF服务应用的可扩展性(Scalability)、性能(Performance)、吞吐量(Throughput)等具有决定性作用。 阅读全文
posted @ 2009-11-05 20:17 Artech 阅读(8094) 评论(15) 推荐(8)
摘要: 今天在一个由矿大校友组成的QQ群里,有人发了一个视频连接链接(http://v.youku.com/v_show/id_XMTI2MTQwNzIw.html),点进去看,原来是一部由矿也大学投资拍摄的影片,名字叫做《我在这里》,是为了中国矿业大学百年校庆而拍摄。影片以中国矿业大学年轻学生的爱情故事为主轴,讲述了以庞小元、胡紫心为代表的新一代大学生的情感生活与奋斗历程。他们敢爱敢恨,经历困惑之后最终确立了人生的理想,将青春奉献给祖国最需要的地方,投身采矿事业。影片通过老、中、青三代矿大人的故事展现了矿大人爱国爱校、艰苦奋斗、无私奉献的精神。时长90多分钟的影片由青年导演武洪武先生执导,从我校南湖校区教学楼、行政楼、实验室、餐厅和学生宿舍等多个地点实地取景,以我校学生作为群众演员进行拍摄。 阅读全文
posted @ 2009-11-05 19:22 Artech 阅读(3447) 评论(20) 推荐(2)
摘要: 在[上篇]中,我们分别站在消息交换和编程的角度介绍了SOAP Fault和FaultException异常。在服务执行过程中,我们手工抛出FaultException异常,WCF服务端框架会对该异常对象进行序列化病最终生成Fault消息。当WCF客户端框架介绍到该Fault消息之后,会做一项相反的操作:对Fault消息中进行解析和反序列化,重新生成并抛出FaultException异常。WCF框架自动为我们作了这么多“幕后”工作,使得开发人员可以完全采用编写一般的.NET应用程序的模式进行异常的处理:在错误的地方抛出相应异常,对于潜在出错的方法调用进行相应的异常捕获和处理。所以,WCF的异常处理框架的核心功能就是实现FaultException异常和Faul 阅读全文
posted @ 2009-10-29 19:52 Artech 阅读(3152) 评论(10) 推荐(4)
摘要: 对于上一篇文章 (WCF基本异常处理模式:[上篇]、[中篇]、[下篇]),主要是站在最终开发者的角度对WCF关于异常处理编程模式进行了介绍,接下来,我们需要将我们的目光转移到WCF框架内部,深入剖析整个WCF异常处理流程。 阅读全文
posted @ 2009-10-28 20:58 Artech 阅读(5018) 评论(13) 推荐(6)
摘要: 从FaultContractAttribute的定义我们可以看出,该特性可以在同一个目标对象上面多次应用(AllowMultiple = true)。但是,如果你在同一个操作方法上面应用了多了FaultContractAttribute特性的时候,需要遵循怎样的规则呢,这是本篇文章着重要介绍的内容。 阅读全文
posted @ 2009-10-27 19:11 Artech 阅读(5264) 评论(7) 推荐(8)
摘要: 通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultException异常),其相关的错误信息仅仅限于服务端可见,并不会被WCF传递到客户端;如果将开启了IncludeExceptionDetailInFaults的ServiceDebug服务行为通过声明(通过在服务类型上应用ServiceBehaviorAttrite特性)或者配置的方式应用到相应的服务上,异常相关的所有细节信息将会原封不动地向客户端传送。 这两种方式体现了两种极端的异常传播(Exception Propagation)机制,对于基于服务操作执行过程中抛出的异常的错误细节,要么完全对客户端屏蔽,要么全部暴露于客户端。 阅读全文
posted @ 2009-10-22 18:17 Artech 阅读(8283) 评论(10) 推荐(8)
摘要: 由于WCF采用.NET托管语言(C#和NET)作为其主要的编程语言,注定以了基于WCF的编程方式不可能很复杂。同时,WCF设计的一个目的就是提供基于非业务逻辑的通信实现,为编程人员提供一套简单易用的应用编程接口(API)。WCF编程模式的简单性同样体现在异常处理上面,本篇文章的主要目的就是对WCF基于异常处理的编程模式做一个简单的介绍。 阅读全文
posted @ 2009-10-21 22:36 Artech 阅读(11552) 评论(16) 推荐(11)
摘要: 任何一个程序都需要运行于一个确定的进程中,进程是一个容器,其中包含程序实例运行所需的资源。同理,一个WCF服务的监听与执行同样需要通过一个进程来承载。我们将为WCF服务创建或指定一个进程的方式称为服务寄宿(Service Hosting)。服务寄宿的本质通过某种方式,创建或者指定一个进程用以监听服务的请求和执行服务操作,为服务提供一个运行环境。服务寄宿的手段是为一个WCF服务类型创建一个ServiceHost对象(或者任何继承于ServiceHostBase的对象)。无论采用哪种寄宿方式,在为某个服务创建ServiceHost的过程中,WCF框架内部会执行一系列的操作,其中最重要的步骤就是为服务创建服务描述(Service Description)。在本篇文章中,我们将对服务描述进行全面的介绍。 阅读全文
posted @ 2009-08-27 16:30 Artech 阅读(7074) 评论(9) 推荐(8)
摘要: 通过上篇的介绍,我们知道了WCF所有与编码与解码相关的功能都实现在相应的XmlDictionaryWriter和XmlDictionaryReader中。但是在真正的WCF处理框架中,却并不直接使用XmlDictioanryWriter和XmlDictionaryReader对象,而通过相应的消息编码器(MessageEncoder)对其进行进一步封装,专门用于消息的编码和解码。 阅读全文
posted @ 2009-08-06 19:31 Artech 阅读(6259) 评论(23) 推荐(10)
摘要: 消息作为WCF进行通信的唯一媒介,最终需要通过写入传输层进行传递。而对消息进行传输的一个前提或者是一项必不可少的工作是对消息进行相应的编码。WCF提供了一系列可供选择的编码方式,它们分别在互操作和性能各具优势。在本篇文章我们将对各种编码方式进行消息的讨论。 阅读全文
posted @ 2009-08-05 21:51 Artech 阅读(6952) 评论(24) 推荐(13)
摘要: [For Arnon Rotem-Gal-Oz’s Article:http://dobbscodetalk.com/index.php?option=com_myblog&show=CRUD-is-bad-for-REST.html&Itemid=29]In one of my previous posts (Rest: good, bad and ugly), I made a passing comment, about how I think using CRUD in RESTful service is a bad practice. I received a few comments / questions asking why do I say that – so what’s wrong with CRUD and REST? 阅读全文
posted @ 2009-08-05 08:43 Artech 阅读(1905) 评论(1) 推荐(2)
摘要: 在本篇文章中,我们将讨论WCF四大契约(服务契约、数据契约、消息契约和错误契约)之一的消息契约(Message Contract)。服务契约关注于对服务操作的描述,数据契约关注于对于数据结构和格式的描述,而消息契约关注的是类型成员与消息元素的匹配关系...... 阅读全文
posted @ 2009-08-02 10:06 Artech 阅读(8979) 评论(12) 推荐(13)
摘要: 《WCF技术剖析(卷1)》自出版近20天以来,得到了园子里的朋友和广大WCF爱好者的一致好评,并被卓越网计算机书店作为首页推荐,在这里对大家的支持表示感谢。同时我将一直坚持这个博文系列,与大家分享我对WCF一些感悟和学习经验。在《消息(Message)详解》系列的上篇和中篇,先后对消息版本、详细创建、状态机和基于消息的基本操作(读取、写入、拷贝、关闭)进行了深入剖析,接下来我们来谈谈消息的另一个重要组成部分:消息报头(Message Header)。 阅读全文
posted @ 2009-08-01 10:44 Artech 阅读(7491) 评论(16) 推荐(14)
摘要: 在上篇中大体上围绕着Message的两个话题进行讲述:消息版本(Message Version)和采用五种不同的方式创建Message。本篇文章将会详细介绍Message的另外两个主题:和消息的基本操作,比如读、写、拷贝、关闭等,以及消息状态机(Message State Machine)。 阅读全文
posted @ 2009-07-28 18:16 Artech 阅读(6006) 评论(12) 推荐(5)
摘要: 消息交换是WCF进行通信的唯一手段,通过方法调用(Method Call)形式体现的服务访问需要转化成具体的消息,并通过相应的编码(Encoding)才能通过传输通道发送到服务端;服务操作执行的结果也只能以消息的形式才能被正常地返回到客户端。所以,消息在整个WCF体系结构中处于一个核心的地位,WCF可以看成是一个消息处理的管道。接下来我将分上、中、a href="http://chuna2.787528.xyz/artech/archive/200 阅读全文
posted @ 2009-07-27 21:55 Artech 阅读(10041) 评论(10) 推荐(19)
摘要: 数据契约是对用于交换的数据结构的描述,是数据序列化和反序列化的依据。在一个WCF应用中,客户端和服务端必须通过等效的数据契约方能进行有效的数据交换。随着时间的推移,不可避免地,我们会面临着数据契约版本的变化,比如数据成员的添加和删除、成员名称或者命名空间 阅读全文
posted @ 2009-07-21 23:25 Artech 阅读(5380) 评论(11) 推荐(10)
摘要: 如果一个类型,不一定是数据契约,和给定的数据契约具有很大的差异,而我们要将该类型的对象序列化成基于数据契约对应的XML。反之,对于一段给定的基于数据契约的XML,要通过反序列化生成该类型的对象,我们该如何实现这样的场景? 这就需要使用到一个特殊的对象:数据契约代理(DataContract Surrogate)。 阅读全文
posted @ 2009-07-20 18:23 Artech 阅读(6472) 评论(20) 推荐(14)
摘要: 本书从WCF的终结点谈起,对终结点的三要素进行了全面而深入的介绍,帮助读者了解地址、绑定和契约的本质。通过本书对序列化的深入讲解,读者可了解WCF进行操作方法调用与消息之间转化的本质;深入剖析消息编码则会帮助读者从根本上把握WCF进行消息编码和解码的实现机制,以及不同编码方式在性能、互操作性及使用场景上的差异;同时本书从WCF的服务端框架和客户端框架进行深层次的剖析,介绍了服务寄宿和服务调用;对实例化和会话进行了讨论,从服务实例的激活和客户端状态保持两个侧面详细介绍WCF的实例上下文提供机制和基于会话信道的会话实现。最后,本书提供了一个完整的案例帮助读者掌握如何利用本书涉及的内容搭建一个基本的WCF分布式应用。本书不仅适合那些尚未接触过WCF,希望尽快入门并进行深入研究的开发人员,同样适合那些对WCF有一定了解的开发设计人员和架构师。 阅读全文
posted @ 2009-07-15 23:36 Artech 阅读(33121) 评论(242) 推荐(38)
摘要: 在.NET中,所有的集合都实现了IEnumerable接口,比如Array、Hashtable、ArrayList、Stack、Queue等。有的集合要求元素具有相同的类型,这种集合一般通过泛型的方式定义,它们实现另一个接口IEnumerable(IEnumerable本身继承自IEnumerable),这样的集合有List、Dictionary、Stack、Queue等。基于集合类型的序列化具有一些特殊的规则和行为,在上篇中我们详细介绍了基于泛型数据契约的序列化规则,接下来我们介绍基于集合对象的序列化,以及基于集合类型的服务操作。 阅读全文
posted @ 2009-07-14 18:26 Artech 阅读(9113) 评论(14) 推荐(16)
摘要: 在.NET Framework 2.0中,泛型第一次被引入。我们可以定义泛型接口、泛型类型、泛型委托和泛型方法。序列化依赖于真实具体的类型,而泛型则刻意模糊了具体类型概念。而集合代表一组对象的组合,集合具有可迭代(Enumerable)的特性,可以通过某个迭代规则遍历集合中的每一个元素。由于范型类型和集合类型在序列化和反序列化上具有一些特殊的行为和规则,在这篇文章中,我将会对此进行详细介绍。上篇先来说所泛型数据契约。 阅读全文
posted @ 2009-07-13 17:38 Artech 阅读(9993) 评论(10) 推荐(17)
摘要: [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道《天天山海经》为此录制的节目视频(苏州话)]]DataContractSerializer承载着所有数据契约对象的序列化和反序列化操作。在上面一篇文章(《数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)》)中,我们谈到DataContractSerializer基本的序列化规则;如何控制DataContractSerializer序列化或者反序列化对象的数量;以及如何在序列化后的XM 阅读全文
posted @ 2009-07-12 16:27 Artech 阅读(10851) 评论(24) 推荐(19)
摘要: [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道《天天山海经》为此录制的节目视频(苏州话)]] 大部分的系统都是以数据为中心的(Data Central),功能的实现表现在对相关数据的正确处理。而数据本身,是有效信息的载体,在不同的环境具有不同的表示。一个分布式的互联系统关注于数据的交换,而数据正常交换的根本前提是参与数据交换的双方对于数据结构的一致性理解。WCF下的序列化(Serialization)解决的是如何将数据从对象的表现形式转变成XML表现形式,以确保数据的正常交换。从本章起,我将讲述WCF序列化的本质,首先从从数据契约谈起。 阅读全文
posted @ 2009-07-09 21:20 Artech 阅读(18679) 评论(11) 推荐(15)
摘要: 说完了客户端的异步服务调用(参阅WCF技术剖析之十一:异步操作在WCF中的应用(上篇)),我们在来谈谈服务端如何通过异步的方式为服务提供实现。在定义服务契约的时候,相信大家已经注意到了OperationContractAttribute特性具有一个bool类型的AsynPattern。该属性可以将一个服务操作定义成异步实现模式,接下来的内容主要是着眼于介绍异步操作的定义和实现原理。 阅读全文
posted @ 2009-07-08 22:56 Artech 阅读(11138) 评论(33) 推荐(10)