摘要: Microsoft 的Visual Studio为我们在应用开发中提供的强大功能,我们是有目共睹。借助该工具,是我们的开发显得更加高效而轻松。从Microsoft把这个IDE的名字从VS.NET 该为VS(比如原来的Visual Studio.NET 2003,现在的版本叫VS2005),可以MS对该IDE的期望和野心:MS要把它改造成一个万能的IDE。不过任何都有其两面性,对于我们广大的开发者来说,VS是我们的各种行为简单化,傻瓜化;但是在另一方面,他也会蒙蔽我们的眼睛,使我们对它背后做的事情视而不见。以我们的ASP.NET Website开发为例,编程、编译、部署都可以借助VS,有了VS一切显得如此简单,每个人都会做,但是我想很多一部分人对一个ASP.NET Website如何进行编译不会很了解。这篇文章就来谈谈背后的故事——ASP.NET是如何进行编译的。由于篇幅的问题整篇文章分两个部分:动态编译 Dynamical Compilation和预编译(Precompilation)。  阅读全文

Artech 2007-05-26 00:32 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/05/26/760292.html
posted @ 2008-03-13 21:15 咔咔 阅读(51) 评论(0) 编辑
     摘要: 我们知道,WCF是MS基于SOA建立的一套在分布式环境中各个相对独立的Application进行Communication的构架。他实现了最新的基于WS-*规范。按照SOA的原则,相对独自的业务逻辑以service的形式封装,调用者通过Messaging的方式调用Service。对于承载着某个业务功能的实现的Service应该具有Context无关性、甚至是Solution无关性,Service才能实现最大限度的重用。
在一个C/S(Client/Service)场景中,Context无关性体现在Client对Service的每次调用都是完全不相关的。但是在有些情况下,我们却希望系统为我们创建一个Session来保留某个Client和Service的进行交互的状态。所以,像Web Service一样,WCF也提供了对Session的支持。对于WCF来说,Client和Service之间的交互都通过Soap Message来实现的,每次交互的过程就是一次简单的Message Exchange。所以从Messaging的角度来讲,WCF的Session就是把某个把相关的Messag  阅读全文

Artech 2007-06-13 01:59 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/06/13/781216.html
posted @ 2008-03-13 21:15 咔咔 阅读(24) 评论(0) 编辑
     摘要: 无论对于Web Service还是WCF,Client和Service之间交互的唯一形式是通过发送和接收Soap Message。在我们对Web Service和WCF进行深入学习的时候,借助一些Soap Trace 工具对Soap Message进行深入剖析是非常有必要的。在这些工具之中,我觉得最好用的就是Microsoft Soap Toolkit中的Soap Trace Utility和tcpTrace。我们今天就来讲讲如何在WCF中使用tcpTrace这个工具。  阅读全文

Artech 2007-06-14 00:19 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/06/14/782845.html
posted @ 2008-03-13 21:15 咔咔 阅读(22) 评论(0) 编辑
     摘要: 在任何Application的开发中,对不可预知的异常进行troubleshooting时,异常处理显得尤为重要。对于一般的.NET系统来说,我们简单地借助try/catch可以很容易地实现这一功能。但是对于 一个分布式的环境来说,异常处理就没有那么简单了。按照面向服务的原则,我们把一些可复用的业务逻辑以Service的形式实现,各个Service处于一个自治的环境中,一个Service需要和另一个Service进行交互,只需要获得该Service的描述(Description)就可以了(比如WSDL,Schema和Strategy)。借助标准的、平台无关的通信构架,各个Service之间通过标准的Soap Message进行交互。Service Description、Standard Communication Infrastructure、Soap Message based Communication促使各Service以松耦合的方式结合在一起。但是由于各个Service是自治的,如果一个Service调用另一个Service,在服务提供方抛出的Exception必须被封装在S  阅读全文

Artech 2007-06-15 02:18 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/06/15/784090.html
posted @ 2008-03-13 21:15 咔咔 阅读(23) 评论(0) 编辑
     摘要: 在一个基于面向服务的分布式环境中,借助一个标准的、平台无关的Communication Infrastructure,各个Service通过SOAP Message实现相互之间的交互。这个交互的过程实际上就是Message Exchange的过程。WCF支持不同形式的Message Exchange,我们把这称之为Message Exchange Pattern(MEP), 常见的MEP包括: Request/Reply,Request/Forget(One-way)和Duplex。通过采用Duplex MEP,我们可以实现在Service端Callback Client的操作。虽然WCF为我们实现底层的通信细节,使得我们把精力转移到业务逻辑的实现,进行Transport无关的编程,但是对底层Transport的理解有利于我们根据所处的具体环境选择一个合适的Transport。说到Transport, WCF 经常使用的是以下4个:Http,TCP,Named Pipe,MSMQ。由于不同协议自身的差异,他们对具体MEP的支持方式也会不同,我们今天就来谈谈Http和TCP对Duplex  阅读全文

Artech 2007-06-18 18:32 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/06/18/788071.html
posted @ 2008-03-13 21:15 咔咔 阅读(38) 评论(0) 编辑
     摘要: 在一个分布式的环境中,我们往往需要根据具体的情况采用不同的方式进行数据的传输。比如在一个Intranet内,我们一般通过TCP进行高效的数据通信;而在一个Internet的环境中,我们则通常使用Http进行跨平台的数据交换。而这些通信方式具有一个显著的特点,那就是他们是基于Connection的,也就是说,交互双方在进行通信的时候必须保证有一个可用的Connection存在于他们之间。而在某些时候,比如那些使用拨号连接的用户、以及使用便携式计算机的用户,我们不能保证在他们和需要访问的Server之间有一个的可靠的连接,在这种情况下,基于Messaging Queue的连接就显得尤为重要了。我们今天就来谈谈在WCF中如何使用MSMQ。  阅读全文

Artech 2007-06-29 00:57 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/06/29/799529.html
posted @ 2008-03-13 21:15 咔咔 阅读(34) 评论(0) 编辑
     摘要: 我们知道MSMQ天生就具有异步的特性,它只能以One-way的MEP(Message Exchange Pattern)进行通信。Client和Service之间采用One-way MEP的话就意味着Client调用Service之后立即返回,它无法获得Service的执行结果,也无法捕捉Service运行的Exception。
但是在有些场景 中,这是无法容忍的。再拿我在上一篇文章的Order Delivery的例子来说。Client向Service提交了Order,却无法确认该Order是否被Service正确处理,这显然是不能接受的。我们今天就来讨论一下,如何创建一个Responsive Service来解决这个问题:Client不再是对Service的执行情况一无所知,它可以获知Order是否被Service正确处理了。  阅读全文

Artech 2007-07-01 16:06 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/07/01/802069.html
posted @ 2008-03-13 21:15 咔咔 阅读(23) 评论(0) 编辑
     摘要: 在C#3.0中,引入了一些列新的特性,比如: Implicitly typed local variable, Extension method,Lambda expression, Object initializer, Anonymous type, Implicitly typed array, Query expression, Expression tree. 个人觉得在这一系列新特性的,最具创新意义的还是Extension method,它从根本上解决了这样的问题:在保持现有Type原封不动的情况下对其进行扩展,你可以在对Type的定义不做任何变动的情况下,为之添加所需的方法成员。在继 深入理解C# 3.0的新特性(1): Anonymous Type 之后,在这篇文章中,我将介绍我自己对Extension method这个新特性的理解。  阅读全文

Artech 2007-07-18 01:30 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/07/18/821881.html
posted @ 2008-03-13 21:15 咔咔 阅读(13) 评论(0) 编辑
     摘要: 通过《深入理解C# 3.0的新特性(2):Extension Method - Part I》介绍,我们知道了在C# 中如何去定义一个Extension Method:它是定义在一个Static class中的、第一个Parameter标记为this关键字的Static Method。在这一部分中,我们进一步来认识Extension Method的本质... ...  阅读全文

Artech 2007-07-19 13:47 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/07/19/823847.html
posted @ 2008-03-13 21:15 咔咔 阅读(16) 评论(0) 编辑
     摘要: 继上一章,介绍Extension Method之后,我们接着来介绍另一个重要的特性:Lambda Expression。在前面的两篇文章中,我一再在强调这样的一个概念:C# 3.x新引入的这些特性仅仅反映在Programming Language和相应的Compiler层面。通过编译生成的Assembly的IL和原来并没有本质的改变。从这个意义上讲,所有的这些其实是编译器给我们玩得障眼法而已。Lambda Expression也不例外, Lambda Expression就是一个Anonymous Delegate,无论是Named Delegate也好、Anonymous Delegate也好,其本质也就是一个Delegate。  阅读全文

Artech 2007-08-22 13:44 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/08/22/865247.html
posted @ 2008-03-13 21:15 咔咔 阅读(52) 评论(0) 编辑
     摘要: 前几天有一个朋友在MSN上问我“ASP.NET 从最初的接收到Http request到最终生成Response的整个流程到底是怎样的?”我觉得这个问题涉及到IIS和ASP.NETASP.NET Runtime的处理模型的问题,并不是三言两语就能说清楚的,所以决定写这样一篇介绍IIS和ASP.NET Runtime Process Model的文章,谈谈我对此的一个粗浅的认识,如果有什么不对的地方,希望大家及时指正。  阅读全文

Artech 2007-09-09 16:43 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/09/09/887528.html
posted @ 2008-03-13 21:15 咔咔 阅读(22) 评论(0) 编辑
     摘要: 相信这篇文章的每个读者都使用个过ASP.NET进行过基于Web的应用开发, ASP.NET是什么?如果站在一个相对High Level的角度,我们可以这样来定义ASP.NET:ASP.NET是一个基于Web的开发平台,提供构建企业级应用所需的Service、Programming Model和Software的Infrastructure。如果我们以一个Low Level的角度来看,它本质上就是一个消除处理器:他接受IIS(确切地说应该是ASP.NET ISAPI)Forward的Http Request经过一系列的处理,最终产生一个用户希望的Response。所以本篇文章的主要目的在于站在一个相对Low Level的角度介绍ASP.NET的整个Http Request Processing Model。在第一个部分我分别就IIS 5.x和IIS 6的差异介绍了IIS对Http Request的处理,今天我  阅读全文

Artech 2007-09-13 01:59 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/09/13/891262.html
posted @ 2008-03-13 21:15 咔咔 阅读(11) 评论(0) 编辑
     摘要: 相信这篇文章的每个读者都使用个过ASP.NET进行过基于Web的应用开发, ASP.NET是什么?如果站在一个相对High Level的角度,我们可以这样来定义ASP.NET:ASP.NET是一个基于Web的开发平台,提供构建企业级应用所需的Service、Programming Model和Software的Infrastructure。如果我们以一个Low Level的角度来看,它本质上就是一个消除处理器:他接受IIS(确切地说应该是ASP.NET ISAPI)Forward的Http Request经过一系列的处理,最终产生一个用户希望的Response。所以本篇文章的主要目的在于站在一个相对Low Level的角度介绍ASP.NET的整个Http Request Processing Model。在第一个部分我分别就IIS 5.x和IIS 6的差异介绍了IIS对Http Request的处理,今天我  阅读全文

Artech 2007-09-13 02:15 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/09/13/891266.html
posted @ 2008-03-13 21:15 咔咔 阅读(18) 评论(0) 编辑
     摘要: WCF是构建和运行Connected System的一些列技术的总称,它是建立在Web Service Architecture上的一个全新的Communication Infrastructure。你可以把它看成是.NET平台上的新一代的Web Service。WCF为我们提供了Secure & Reliable的Messaging,也为我们提供了更好的Interoperability是的我们可以和其他的平台进行互操作。
在过去半年之后,我陆陆续续写了一些关于WCF介绍的一些文章,我把它命名为“我的WCF之旅”,目的在于向大家分享我学习WCF这一段旅程。现在把把这个系列做一个阶段性的总结,以飨读者。这个总结并不是意味着我将结束这个系列,这个系列还会继续,新加的内容我会补上。  阅读全文

Artech 2007-09-15 13:01 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/09/15/893838.html
posted @ 2008-03-13 21:15 咔咔 阅读(14) 评论(0) 编辑
     摘要: 深入理解C#3.x的新特性系列在沉寂一个月之后,今天继续。在本系列前3部分中,我们分别讨论了Anonymous TypeExtension Method Lambda Expression,今天我们来讨论另一个实用的、有意思的New feature: Automatically Implemented Property。  阅读全文

Artech 2007-09-15 21:07 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/09/15/894270.html
posted @ 2008-03-13 21:15 咔咔 阅读(11) 评论(0) 编辑
     摘要: 深入理解C# 3.x的新特性系列自开篇以后,已经有两个月了。在前面的章节中,我们先后深入讨论了C# 3.x新引入的一些列新特性:Anomynous Type、Extension Method、Lambda Expression、Automatically Implemented Property,今天我们来讨论本系列的涉及的另外两个简单的Feature: Object Initializer 和 Collection Initializer。  阅读全文

Artech 2007-09-30 17:17 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/09/30/912166.html
posted @ 2008-03-13 21:15 咔咔 阅读(14) 评论(0) 编辑
     摘要: 较之C# 2.0, C# 3.x引入了一些列新的特性,为我们编程带来很大的便利,通过有效地利用这些新特性,我们可以编写出更加简洁、优雅的程序。不过这些新特性仅仅是编译器给我们耍的小花招:在编译的时候加入一些必要的Code,使这些在C# 2.0角度看略显残缺的Code变得“完整”,实际上最终生成的Assembly和在C# 2.0时代并没有本质的不同。为此,有些人对这些新特性不以为然,觉得仅仅是一些表面文章,是鸡肋。但是我的观点是:既然这些特性能给我们的编程带来便利,干嘛不用呢?  阅读全文

Artech 2007-10-07 12:38 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/10/07/915969.html
posted @ 2008-03-13 21:15 咔咔 阅读(19) 评论(0) 编辑
     摘要: SOA一个主要的目标就是促进不同技术平台的互操作,要真正实现这样一个宏伟的目标是一件极不容易的事情,需要不同的厂商和标准组织相互协作,制定一个大家一致遵循的标准。这样一个标准就是WS-* 。我们很清楚,无论个个厂商各自的标准怎样千差万别,但是有个标准是他们必须要遵循的,那就是Internet的标准,如果哪家公司拒绝Internet,那肯定要被淘汰的。而对于Internet,基于Http的网络协议和基于XML的数据表达已经成为了事实上的标准。对于SOA来说,XML不仅仅用于表示Service调用携带的数据(参数和返回值),更用于表示这个调用本身,以及满足各种要求的控制信息, 比如基于Security、Session、Reliable Messaging、Transaction等等的控制信息。WS-*就是一个基于XML的标准。而对于SOA中的Contract所要做的就是寻求一种厂商中立的方式来表示Service的接口、和用于交互的数据结构。前者就是Service Contract、后者就是Data Contract。  阅读全文

Artech 2007-11-27 20:32 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/11/27/974627.html
posted @ 2008-03-13 21:15 咔咔 阅读(15) 评论(0) 编辑
     摘要: 通过第一部分的介绍,我们可以体会到,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 Contract。
  阅读全文

Artech 2007-11-27 20:43 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/11/27/974639.html
posted @ 2008-03-13 21:15 咔咔 阅读(12) 评论(0) 编辑
     摘要: 在本篇文章上一部分Order Processing的例子中,我们看到原本已Collection形式定义的DetailList属性(public IList DetailList),在Data Contract中却以Array的方式体现(public OrderDetail[] DetailList)。我们现在就来详细地讨论一下基于Collection & Dictionary 的Data Contract。  阅读全文

Artech 2007-11-27 20:55 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/11/27/974665.html
posted @ 2008-03-13 21:15 咔咔 阅读(22) 评论(0) 编辑
     摘要: 软件工程是一门独特的工程艺术,需要解决的是不断改变的需求变化。而对于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版本的改变。
  阅读全文

Artech 2007-11-27 21:06 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2007/11/27/974671.html
posted @ 2008-03-13 21:15 咔咔 阅读(16) 评论(0) 编辑
     摘要: 在过去的半年里,定期或者不定期地写点东西已经成为了我的一种习惯。可是最近两个月来一直忙于工作的事情一直足够的时间留给自己,虽然给自己列了很长一串写作计划,可是心有余而力不足。这一段工作主要是帮助公司开发一套分布式的开发框架,对一些技术和设计方法有了一些新的认识。这两天的工作主要是如何把Enterprise Library V3.1的PIAB(Policy Injection Application Block)引入到我们自己的框架中,为此对PIAB进行了一些研究,借此机会与大家一起分享。  阅读全文

Artech 2008-01-29 12:54 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2008/01/29/1057379.html
posted @ 2008-03-13 21:15 咔咔 阅读(60) 评论(0) 编辑
     摘要: 在前面一篇文章中,我对Enterprise Library中的PIAB (Policy Injection Application Block)作了简单的介绍。在这篇文章主要谈谈我个人对PIAB设计和实现原理的一些理解。在介绍过程中,我尽量采用由浅入深出的方式,同时结合例子、Source Code。希望通过本片文章让大家对PIAB有一个全面、深刻的认识。  阅读全文

Artech 2008-01-31 09:45 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2008/01/31/1059492.html
posted @ 2008-03-13 21:15 咔咔 阅读(57) 评论(0) 编辑
     摘要: 本系列的第一部分对PIAB使用场景进行了简单的介绍,作中阐述了通过PI(Policy Injection)的方式实现了Business Logic和Non-Business Infrastructure Logic的分离,从而实现了AOP(Aspect Oriented Programming)。在第二部分中详细介绍PIAB的实现机制:通过自定义RealProxy的方式实现了Method Injection。通过这几天接收到的网友的留言,觉得很多人对在具体的项目开发中如何使用PIAB还有很多困惑,对PIAB的价值还不是很了解。为此,在本系列的第三篇文章中,我将以Walk through的方式定义一个Custom CallHa  阅读全文

Artech 2008-02-19 09:15 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2008/02/19/1073033.html
posted @ 2008-03-13 21:15 咔咔 阅读(37) 评论(0) 编辑
     摘要: PIAB为我们提供了一个很好地实现AOP的方式。AOP旨在实现Business Logic和Non-Business Infrastructure Logic的分离。通过PIAB,我们将这些业务无关的逻辑定义在一个个的CallHandler中,然后通过Attribute或者Configuration的方式,将我们所需的CallHandler运用到相应的目标对象中。从这个意义上讲,PIAB具有很好的Flexibility和Extensibility。但是,就我看来PIAB也具有一些不足之处,其最大的局限性在于:不能控制运用到某个Method的多个方法的执行顺序。而让CallHandler按照我们希望的顺序进行调用是非常有必要的。  阅读全文

Artech 2008-02-21 09:40 发表评论

文章来源:http://www.cnblogs.com/artech/archive/2008/02/21/1076003.html
posted @ 2008-03-13 21:15 咔咔 阅读(27) 评论(0) 编辑