随笔分类 - [01] 技术剖析
摘要:下面通过一个简单的Console Application演示Type Innitializer的执行顺序。希望大家各抒己见,对于实验的结果给出一个圆满的解释,同时希望读者从中理解到更多关于编译、关于CLR一些被我们忽略的细节。
阅读全文
摘要:WCF的通信是基于消息的,如果从消息交换(message exchange)的角度讲,信道层则可以看成是进行消息交换参与者之间的中介。信道层通过一个个信道组成一个连续的channel stack,该channel stack构成了一个消息流通的管道。消息的发送者通过该管道流到消息的接收者,消息的接收者对消息进行相应的处理,生成新的消息通过该管道回复给消息的发送者。本文将着重介绍WCF中的Binding模型,从该模型中,读者将会对WCF如何通过Binding创建channel stack的整个过程有一个大致的了解。
阅读全文
摘要:对于希望对WCF的消息交换有一个深层次了解的读者来说,tcpTracer绝对是一个不可多得好工具。我们将tcpTracer置于服务和服务代理之间,tcpTracer会帮助我们接获、显示和转发流经他的消息。 从本质上讲,tcpTracer是一个路由器。当启动的时候,我们需要设置两个端口:原端口(source port)和目的端口(destination port),然后tcpTracer就会在原端口进行网络监听。一旦请求抵达,他会截获整个请求的消息,并将整个消息显示到消息面板上。随后,tcpTracer会将该消息原封不动地转发给目的端口。在另一方面,从目的端口发送给原端口的消息,也同样被tcpTracer截获、显示和转发。
阅读全文
摘要:对于所有的开发人员来说,Exception Handling是我们每天都要面对的事情。对于基于Source Code的Exception Handling,我想大家已经司空见惯了,但是对于Database级别的Exception Handling,就没有那么常见了。在这篇文章中,我将会介绍我对于基于Database编程中Exception Handling的一些粗浅的认识:在编写Stored Procedure时,如何抛出一个可预知的Exception,ADO.NET如何处理从Database抛出的Exception,如何保存基于Database Exception的Error Message,如何在Database和.NET Application之间进行消息的传递[注:这里的Database主要指SQL Server]。
阅读全文
摘要:我们都知道,WCF支持Duplex的消息交换模式,它允许在service的执行过程中实现对client的回调。WCF这种双向通信的方式是我们可以以Event Broker或者订阅/发布的方式来定义和调用WCF Service。今天我们就给大家一个具体的例子:通过WCF的duplex communication方式现在Session管理。
阅读全文
摘要:我们都知道,WCF支持Duplex的消息交换模式,它允许在service的执行过程中实现对client的回调。WCF这种双向通信的方式是我们可以以Event Broker或者订阅/发布的方式来定义和调用WCF Service。今天我们就给大家一个具体的例子:通过WCF的duplex communication方式现在Session管理。
阅读全文
摘要:在上一篇文章中,我们通过自定义InstanceProvider实现了WCF和微软Enterprise Library Unity Application Block的集成, 今天我们已相同的方式实现WCF与Enterprise Library的另一个Application Block的集成:Policy Injection Application Block (PIAB)。
阅读全文
摘要:松耦合、高内聚是我们进行设计的永恒的目标,如何实现这样的目标呢?我们有很多实现的方式和方法,不管这些方式和方法在表现形式上有什么不同,他们的思想都可以表示为:根据稳定性进行关注点的分离或者分解,交互双方依赖于一个稳定的契约,而降低对对方非稳定性因素的依赖。从抽象和稳定性的关系来讲,抽象的程度和稳定程度成正相关关系。由此才有了我们面向抽象编程的说法,所以“只有依赖于不变,才能应万变”... ...
阅读全文
摘要:在上一篇文章中,我们讨论了如何通过CallContextInitializer实现Localization的例子,具体的做法是将client端的culture通过SOAP header传到service端,然后通过自定义的CallContextInitializer设置当前方法执行的线程culture。在client端,当前culture信息是通过OperationContext.Current.OutgoingMessageHeaders手工至于SOAP Header中的。实际上,我们可以通过基于WCF的另一个可扩展对象来实现这段逻辑,这个可扩展对象就是MessageInspector。我们今天来讨论MessageInspector应用的另外一个场景:如何通过MessageInspector来传递Context信息。
阅读全文
摘要:在上一篇文章中, 我列出了WCF一系列的可扩展对象和元素,并简单介绍了他们各自的功能、适合的场景和具体解决的问题。从本篇开始我将通过一个个具体的例子来介绍如何利用这些扩展点对WCF进行扩展,从而解决一些我们在实现的项目开发中可能出现的问题。
阅读全文
摘要:在本系列的每篇文章中,我多次提到WCF是一个极具可扩展性的分布是消息通信框架。为了让读者对WCF Extension有一个总体的的认识,在这里我会简单列举了我们经常使用的绝大部分的扩展点,以及通过这些扩展点能够解决实现项目开发中的那些问题。
阅读全文
摘要:在本系列的第一部分、第二部分中,我们对WCF的channel layer进行了深入的讨论。我们接下来继续讨论WCF的ser vice mode layer。本篇文章着重介绍service 端的ServiceMode。写作此篇文章旨在达到以下两个目的:
希望读者对ServiceMode有一个大致的了解,结合前面介绍的channel layer的相关知识,帮助读者了解WCF的整个实现机制和执行的流程。
介绍ServiceMode涉及到的绝大部分extension point,让读者在具体的项目开发中能够根据实际的需要灵活、自由地对WCF进行扩展。
阅读全文
摘要:在上一篇文章中,我们通过一个直接借助BasicHttpBinding对象实现Client和Server端进行通信的例子,对WCF channel layer进行了一个大致上的介绍。由此引出了一些列通信相关的概念和对象,比如Channel,Output channel, Input channel,Request channel, Reply Channel,Duplex channel, Channel Shape,Channel manager,Channel factory, Channel listener, Binding element 等。通过这些元素,我们很容易地实现对WCF channel layer进行扩展。
在本章节中,我们将继续讨论WCF channel layer。我们将通过如何创建和应用custom channel来介绍channel layer一些知识。
阅读全文
摘要:《我的WCF之旅》系列自开篇以来,得到了园子里很多朋友的厚爱,并荣登了博客园2007年度系列博文Top 10。由于工作原因,沉寂了几个月,今天开始WCF新的旅程。如果说《我的WCF之旅》主要是对WCF基本原理概括性介绍,而对于这个新的系列,我将和大家分享我对WCF的一些实现机制、设计原理的理解,以及我在实际的项目开发中的一些实践经验(比如在后续的一些文章中,我将介绍通过WCF Extension实现一些在真正的分布式项目开发中很有现实意义的功能)。
阅读全文
摘要:软件工程是一门独特的工程艺术,需要解决的是不断改变的需求变化。而对于WCF,对于SOA,由于涉及的是对多个系统之间的交互问题,如何有效地解决不断改变的需求所带来的问题就显得更为重要:Service端版本的变化能否保持现有Consumer的正常调用,Consumer端的改变不至于影响对Service 的正常调用。对于Data Contract来说就是要解决这样的问题:Service端或者Client对Data Type的改变不会影响Service的正常调用。
在系统开发过程中,通过对Data Type添加额外的字段进而对其进行扩展,是一个种很常见的场景。本部分就作中介绍Data Contract的这种变化,Service或者Client的Data Contract在本地添加一个新的Data Member会造成怎样的影响,WCF可以采用怎样的机制来解决这种单方面Data Contract版本的改变。
阅读全文
摘要:在本篇文章上一部分Order Processing的例子中,我们看到原本已Collection形式定义的DetailList属性(public IList DetailList),在Data Contract中却以Array的方式体现(public OrderDetail[] DetailList)。我们现在就来详细地讨论一下基于Collection & Dictionary 的Data Contract。
阅读全文
摘要:通过第一部分的介绍,我们可以体会到,WCF 的Data Contract在CLR Type和Neutral Contract之间搭建了一座桥梁,弥合了.NET世界和厂商中立世界的差异。通过WCF Data Contract我们将CLR Data Type暴露成一个厂商中立的数据结构的描述,同样通过WCF Data Contract我们将一个现有的CLR Data Type和既定的Neutral contract进行适配。
在.NET中,基于Primary Type,比如Int32,String等等,他们具有一个简单的默认的序列化方式和结构,可以说他们不需要Data Contract。接下来我们主要讨论的是一些相对比较特殊的、完全基于.NET的Data Type,比如Generic、Collection,和Dictionary。首先,我们结合例子来谈谈基于Generic的Data Type的Data C
阅读全文
摘要:SOA一个主要的目标就是促进不同技术平台的互操作,要真正实现这样一个宏伟的目标是一件极不容易的事情,需要不同的厂商和标准组织相互协作,制定一个大家一致遵循的标准。这样一个标准就是WS-* 。我们很清楚,无论个个厂商各自的标准怎样千差万别,但是有个标准是他们必须要遵循的,那就是Internet的标准,如果哪家公司拒绝Internet,那肯定要被淘汰的。而对于Internet,基于Http的网络协议和基于XML的数据表达已经成为了事实上的标准。对于SOA来说,XML不仅仅用于表示Service调用携带的数据(参数和返回值),更用于表示这个调用本身,以及满足各种要求的控制信息, 比如基于Security、Session、Reliable Messaging、Transaction等等的控制信息。WS-*就是一个基于XML的标准。而对于SOA中的Contract所要做的就是寻求一种厂商中立的方式来表示Service
阅读全文
摘要:较之C# 2.0, C# 3.x引入了一些列新的特性,为我们编程带来很大的便利,通过有效地利用这些新特性,我们可以编写出更加简洁、优雅的程序。不过这些新特性仅仅是编译器给我们耍的小花招:在编译的时候加入一些必要的Code,使这些在C# 2.0角度看略显残缺的Code变得“完整”,实际上最终生成的Assembly和在C# 2.0时代并没有本质的不同。为此,有些人对这些新特性不以为然,觉得仅仅是一些表面文章,是鸡肋。但是我的观点是:既然这些特性能给我们的编程带来便利,干嘛不用呢?
阅读全文
摘要:深入理解C# 3.x的新特性系列自开篇以后,已经有两个月了。在前面的章节中,我们先后深入讨论了C# 3.x新引入的一些列新特性:Anomynous Type、Extension Method、Lambda Expression、Automatically Implemented Property,今天我们来讨论本系列的涉及的另外两个简单的Feature: Object Initializer 和 Collection Initializer。
阅读全文