上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 22 下一页
摘要: “全书之写印,实系初稿。有时公私琐务猬集,每写一句,三搁其笔;有时兴会淋漓,走笔疾书,絮絮不休;有时意趣萧索,执笔木坐,草草而止。每写一段,自助覆阅,辄摇其首,觉有大不妥者,即贴补重书,故剪刀浆糊乃不离左右。个中甘苦,只自知之。” 在某个阳光明媚的早晨,我在去上班的公交车上翻看岳南先生的《南渡北归》的时候,看到上面这段董作宾描述自己写作《殷历谱》之甘苦的文字,回想起我写作这本书的经历,不禁感慨万千。我无意将《WCF全面解析》自比煌煌巨著《殷历谱》,只是觉得人同此心,这段文字正好描述我写作此书的状态。 阅读全文
posted @ 2012-05-08 08:05 Artech 阅读(46518) 评论(441) 推荐(98) 编辑
摘要: 对于一个需要支持多语言的Web应用,一个很常见的使用方式就是通过请求地址来控制界面呈现所基于的语言文化,比如我们在表示请求地址的URL中将上语言文化代码(比如en或者en-US)来指导服务器应该采用怎样的语言来显示界面的内容。对于一个ASP.NET MVC应用来说,我们很容易通过URL路由来实现这样一个功能。 阅读全文
posted @ 2012-05-04 11:00 Artech 阅读(10773) 评论(49) 推荐(12) 编辑
摘要: 我们不仅可以创建相应的模板来根据Model元数据控制种类型的数据在UI界面上的呈现方法,还可以通过一些扩展来控制Model元数据本身。在某些情况下通过这两者的结合往往可以解决很多特殊数据的呈现问题,我们接下来演示的实例就是典型的例子。 阅读全文
posted @ 2012-05-04 07:44 Artech 阅读(9114) 评论(31) 推荐(27) 编辑
摘要: 当我们调用HtmlHelper或者HtmlHelper的模板方法对整个Model或者Model的某个数据成员以某种模式(显示模式或者编辑模式)进行呈现的时候,通过预先创建的代表Model元数据的ModelMetadata对象都可以找到相应的模板。如果模板对应着某个自定义的分部View,那么只需要执行该View即可;对于默认模板,则直接可以得到相应的HTML。本篇文章着重讨论模板的获取和执行机制。 阅读全文
posted @ 2012-05-03 14:49 Artech 阅读(5807) 评论(4) 推荐(7) 编辑
摘要: 相信大家对TransactionScope都比较熟悉。通过TransactionScope,我们可以很容易地将一组操作纳入同一个事务中。我个人觉得这体现了一种可以重用的模式,即本篇文章介绍的Context+ContextScope模式,这种模式旨在一定范围内创建一个可以共享的上下文信息。 阅读全文
posted @ 2012-05-02 11:24 Artech 阅读(4693) 评论(20) 推荐(12) 编辑
摘要: 通过ModelMetadata表示的Model元数据的一个主要的作用在于为定义在HtmlHelper和HtmlHelper中的模板方法(这些模板方法包括Display/DisplayFor、Editor/EditorFor、DisplayForModel/EditForModel、Lable/LabelFor和DisplayText/DisplayTextFor等)提供用于最终生成HTML的元数据信息。在调用这些方法的时候,如果我们指定了一个具体的通过分部View定义的模板,或者对应的ModelMetadata的TemplateHint属性具有一个模板名称,会自动采用该模板来生成最终的HTML。如果没有指定模板名称,则会根据数据类型在预定义的目录下去寻找做模板的分部View。如果找不到,则会利用默认的模板进行HTML的呈现 阅读全文
posted @ 2012-05-02 06:46 Artech 阅读(16317) 评论(44) 推荐(34) 编辑
摘要: Criminals have long employed the tactic of masking their true identity, from disguises to aliases to caller-id blocking. It should come as no surprise then, that criminals who conduct their nefarious activities on networks and computers should employ such techniques. IP spoofing is one of the most common forms of on-line camouflage. In IP spoofing, an attacker gains unauthorized access to a computer o 阅读全文
posted @ 2012-04-26 11:02 Artech 阅读(2303) 评论(4) 推荐(1) 编辑
摘要: 在介绍用于自定义Model元数据属性的AdditionalMetadataAttribute特性时我们提到了它实现的接口IMedataAware,我们说这是一个非常重要并且有用的接口,通过自定义实现该接口的特性我们可以对最终生成的Model元数据进行自由地定制。 阅读全文
posted @ 2012-04-13 06:40 Artech 阅读(8019) 评论(14) 推荐(17) 编辑
摘要: 在《上篇》我们已经提到过了,Model元数据的定制是通过在作为Model的数据类型极其属性成员上应用相应的特性来实现,这些用于声明式元数据定义的特性大都定义在System.ComponentModel.DataAnnotations.dll程序集中,程序集的名称同时也是对应的命名空间名称,所以我们可以它们为数据注解特性(Data Annotation Attribute),接下来我们来介绍一些常用的数据注解特性,以及它们对于元数据具有怎样的影响。 阅读全文
posted @ 2012-04-12 07:47 Artech 阅读(13069) 评论(19) 推荐(24) 编辑
摘要: Contronoller激活之后,ASP.NET MVC会根据当前请求上下文得到目标Action的名称,然后解析出对应的方法并执行之。在整个Action方法的执行过程中,Model元数据的解析是一个非常重要的环节。ASP.NET MVC中的Model实际上View Model,表示最终绑定到View上的数据,而Model元数据描述了Model的数据结构,以及Model的每个数据成员的一些特性。正是有了Model元数据的存在,才使模板化HTML的呈现机制成为可能。此外,Model元数据支撑了ASP.NET MVC的Model验证体系,因为针对Model的验证规则正是定义在Model元数据中。 阅读全文
posted @ 2012-04-11 07:32 Artech 阅读(18275) 评论(27) 推荐(47) 编辑
摘要: 在未来的一段时间里,我将撰写一系列关于ASP.NET MVC的文章。这些文章旨在剖析ASP.NET MVC框架底层的运行机制,力求将整个框架这个黑盒转换为百盒,将框架本身进行请求处理的流程完整而清晰地呈现在读者面前,让读者知其然并知其所以然。了解ASP.NET MVC框架本身的原理,不仅仅可以帮助我们更好地进行相关的编程,还能让我们根据项目具体的需求对其进行得心应手地扩展——因为ASP.NET MVC本身是一个极具扩展性的框架。 阅读全文
posted @ 2012-04-10 08:11 Artech 阅读(105042) 评论(195) 推荐(245) 编辑
摘要: 除了通过自定义ControllerFactory的方式引入IoC之外,在使用默认DefaultControllerFactory情况下也可以通过一些扩展使基于IoC的Controller激活成为可能。主要的方式就是自定义ControllerActivator和 DependencyResolver。 阅读全文
posted @ 2012-04-01 12:33 Artech 阅读(11522) 评论(18) 推荐(17) 编辑
摘要: IoC简单地说就是应用本身不负责依赖对象的创建和维护,而交给一个外部容器来负责。这样控制权就由应用转移到了外部IoC容器,控制权就实现了所谓的反转。比如在类型A中需要使用类型B的实例,而B实例的创建并不由A来负责,而是通过外部容器来创建。通过IoC的方式是实现针对目标Controller的激活具有重要的意义。 阅读全文
posted @ 2012-04-01 08:33 Artech 阅读(16719) 评论(32) 推荐(50) 编辑
摘要: Controller激活系统最终通过注册的ControllerFactory创建相应的Conroller对象,如果没有对ControllerFactory类型或者类型进行显式注册(通过调用当前ControllerBuilder的SetControllerFactory方法),默认使用的是一个DefaultControllerFactory对象,我们现在就来讨论实现在DefaultControllerFactory类型中的默认Controller激活机制。 阅读全文
posted @ 2012-03-31 12:54 Artech 阅读(8268) 评论(9) 推荐(23) 编辑
摘要: 我们将整个ASP.NET MVC框架划分为若干个子系统,那么针对请求上下文激活目标Controller对象的子系统被我们成为Controller激活系统。本系列将对Controller的激活系统进行深入地剖析,让你明白Controller到底是如何创建的。 阅读全文
posted @ 2012-03-31 09:10 Artech 阅读(14459) 评论(23) 推荐(45) 编辑
摘要: 我们知道一个请求最终通过一个具体的HttpHandler进行处理,而我们熟悉的用于表示一个Web页面的Page对象就是一个HttpHandler,被用于处理基于某个.aspx文件的请求。我们可以通过HttpHandler的动态映射来实现请求地址与物理文件路径之间的分离。实际上ASP.NET路由系统就是采用了这样的实现原理。 阅读全文
posted @ 2012-03-28 08:15 Artech 阅读(12705) 评论(14) 推荐(32) 编辑
摘要: ASP.NET 路由系统通过注册的路由表旨在实现两个“方向”的路有功能,即针对入栈请求的路由和出栈URL的生成。前者通过调用代表全局路由表的RouteCollection对象的GetRouteData方法实现,后者则依赖于RouteCollection的GetVirtualPathData方法,而最终还是落在继承自RouteBase的路由对象的同名方法的调用上。为了编程的方面,ASP.NET MVC为了设计了HtmlHelper和UrlHelper这两个帮助类,我们可以通过调用它们的ActionLink/RouteLink和Action/RouteUrl根据注册的路有规则生成链接或者URL。从本质上讲,HtmlHelper/UrlHelper实现的对URL的生成最终还是依赖于上面所说的GetVirtualPathData方法。 阅读全文
posted @ 2012-03-27 08:09 Artech 阅读(20305) 评论(9) 推荐(32) 编辑
摘要: 上周我写了三篇文章(一、二、三)详细地介绍了ASP.NET的路由系统。ASP.NET的路由系统旨在通过注册URL模板与物理文件之间的映射进而实现请求地址与文件路径之间的分离,但是对于ASP.NET MVC应用来说,请求的目标不再是一个具体的物理文件,而是定义在某个Controller类型中的Action方法。出于自身路由特点的需要,ASP.NET对ASP.NET的路由系统进行了相应的扩展。 阅读全文
posted @ 2012-03-26 08:14 Artech 阅读(39390) 评论(43) 推荐(58) 编辑
摘要: 前面我们已经提到过,ASP.NET 的路由系统主要具有两个方面的应用,其一就是通过注册URL模板与物理文件路径的匹配实现请求地址和物理地址的分离;另一个则是通过注册的路由规测生成一个相应的URL。后者通过调用RouteCollection类型的GetVirtualPath方法来实现。[源代码从这里下载] 阅读全文
posted @ 2012-03-21 08:10 Artech 阅读(14917) 评论(28) 推荐(27) 编辑
摘要: 我们可以通过RouteTable的静态属性Routes得到一个基于应用的全局路由表,这是一个类型的RouteCollection的集合对象,我们可以通过调用它的MapPageRoute进行路由映射。接下来我们通过实现演示的方式来说明路由注册的一些细节问题。 阅读全文
posted @ 2012-03-20 08:29 Artech 阅读(34709) 评论(39) 推荐(66) 编辑
摘要: 表现为请求地址与目标Controller和Action的动态映射的URL路由系统并不是专属于ASP.NET MVC,而是直接建立在ASP.NET 中。ASP.NET通过URL路由系统实现了请求地址与物理文件的分离。[源代码地址从这里下载] 阅读全文
posted @ 2012-03-19 07:43 Artech 阅读(23385) 评论(36) 推荐(72) 编辑
摘要: 我们知道VS开发中引用的程序集和运行时的程序集来源于不同的地方,前者来源于%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v{version},后者则来源于GAC,你是否发现了它们之间存在着差异吗? 阅读全文
posted @ 2012-03-17 11:32 Artech 阅读(4536) 评论(10) 推荐(6) 编辑
摘要: 在《为HtmlHelper添加一个RadioButtonList扩展方法》中我通过对HtmlHelper和HtmlHelper的扩展使我们可以采用”RadioButtonList”的方式对一组类型为“radio”的<input>元素进行操作。昨天对对此进行了一些改进,并将“CheckBoxList”的功能添加进来。[源代码从这里下载] 阅读全文
posted @ 2012-03-16 10:11 Artech 阅读(16891) 评论(19) 推荐(21) 编辑
摘要: 在前面一篇文章中,我们通过对HtmlHelper的扩展简化了对DropDownList(Single-Line-Select)和ListBox(Multiple-Line-Select)的绑定,以及对作为数据源的列表进行单独维护。现在我们为HtmlHelper/HtmlHelper添加一个RadioButtonList/RadioButtonListFor扩展方法实现一组RadioButton的绑定。[源代码从这里下载] 阅读全文
posted @ 2012-03-15 14:10 Artech 阅读(11134) 评论(13) 推荐(16) 编辑
摘要: 在众多表单元素中,有一类select元素用于绑定一组预定义列表。传统的ASP.NET Web Form中,它对应着一组重要的控件类型,即ListControl。ASP.NET MVC通过对HtmlHelper和HtmlHelper<TModel>的扩展实现了对不同类型的select元素的绑定,它们以扩展方法的形式定义在SelectExtensions中。当我们在操作这些扩展方法的时候,必须手工地提供列表项集合。如果我们建立一个独立的组件来维护这些预定的列表,那么我们就可以定义一些更加简单的扩展方法以避免手工地指定列表项。 阅读全文
posted @ 2012-03-13 17:37 Artech 阅读(7557) 评论(10) 推荐(12) 编辑
摘要: 作为Controller基类ControllerBase的Execute方法的核心在于对Action方法的执行和作为方法返回的ActionResult的执行,两者的执行是通过一个叫做ActionInvoker的组件来完成的。由于Action方法具有相应的参数,在执行Action方法之前必须进行参数的绑定。ASP.NET MVC将这个机制成为Model的绑定,而这又涉及到另一个重要的组件ModelBinder 阅读全文
posted @ 2012-03-12 17:30 Artech 阅读(16395) 评论(27) 推荐(40) 编辑
摘要: ASP.NET MVC的URL路由系统通过注册的路由表对HTTP请求进行解析从而得到一个用于封装路由数据的RouteData对象,而这个过程是通过自定义的UrlRoutingModule对HttpApplication的PostResolveRequestCache事件进行注册实现的。RouteData中已经包含了目标Controller的名称,现在我们来进一步分析真正的Controller对象是如何被激活的。 阅读全文
posted @ 2012-03-12 09:19 Artech 阅读(16180) 评论(16) 推荐(51) 编辑
摘要: 在一个ASP.NET MVC应用来说,针对HTTP请求的处理和相应定义Controller类型的某个Action方法中,每个HTTP请求的目标对象不再像ASP .NET Web Form应用一样是一个物理文件,而是某个Controller的某个Action。目标Controller和Action的名称包含在HTTP请求中,而ASP.NET MVC的首要任务就是通过当前HTTP请求的解析得到正确的Controller和Action的名称。这个过程是通过ASP.NET MVC的URL路由机制来实现的。 阅读全文
posted @ 2012-03-11 20:25 Artech 阅读(20439) 评论(21) 推荐(65) 编辑
摘要: ASP.NET由于采用了管道式设计,具有很好的扩展性,而整个ASP.NET MVC应用框架就是通过扩展ASP.NET实现的。通过上面对ASP.NET管道设计的介绍,我们知道ASP.NET的扩展点只要体现在HttpMoudle和HttpHandler这两个核心组建之上,实际上整个ASP.NET MVC框架就是通过自定义的HttpMoudle和HttpHandler实现的。为了上读者从整体上把握ASP.NET MVC的工作机制,接下来我按照其原理通过一些自定义组件来模拟ASP.NET MVC的运行原理,我们也可以将此视为一个“迷你版”的ASP.NET MVC。 阅读全文
posted @ 2012-03-11 09:34 Artech 阅读(24599) 评论(53) 推荐(70) 编辑
摘要: 作为MVC最初提出者的Trygve M. H. Reenskau实际是将MVC视为一种范例(Paradigm),模式和范例的区别在于前者可以直接应用到具体的应用上,而后者则仅仅提供一些基本的指导方针。在软件设计的发展历程中出现了一些MVC的变体(Varation),它们遵循定义在MVC中的基本原理。我们现在来简单地讨论一些一个常用的MVC变体。 阅读全文
posted @ 2012-03-08 21:31 Artech 阅读(17242) 评论(39) 推荐(53) 编辑
摘要: MVC是Trygve M. H. Reenskau在1979年访问施乐帕克研究中心(Xerox PARC)期间是提出一种主要针对GUI应用的软件架构模式。MVC体现了关注点分离这一基本的设计方针,它将构成一个人机交互应用涉及到的功能分为Model、Controller和View三部分。本篇文章(上、下篇)为你详细介绍MVC模式和它两个常用的变体MVP和Model2。 阅读全文
posted @ 2012-03-08 17:58 Artech 阅读(19014) 评论(36) 推荐(40) 编辑
摘要: 不知道大家是否意识到一个现象,我们所说的Web服务其实并没有直接建立在Web上而是建立在SOAP上。SOAP居然成为了Web服务的标准,以至于我们提到Web服务就会想到SOAP。随着在Web服务中引入了REST架构,SOAP在整个Web服务体系中的垄断地位正在发生改变,或者已经发生了改变。REST提倡一种面向资源的架构(ROA: Resource Oriented Architecture),鼓励我们直接在Web上建立一种轻量级的Web服务。WCF在3.5就提供了对REST的支持,在4.0中对此进行较大的改进。 阅读全文
posted @ 2012-02-15 08:56 Artech 阅读(21886) 评论(32) 推荐(17) 编辑
摘要: 条件获取(Conditional Update)可以避免相同数据的重复传输,进而提高性能。条件更新(Conditional Update)用于解决资源并发操作问题。如果我们预先获取一个资源进行修改或者删除,条件更新检验帮助我们确认资源被获取出来到针对它的修改/删除操作被提交的这段时间内是否被其他人改动过。 阅读全文
posted @ 2012-02-14 08:41 Artech 阅读(6738) 评论(6) 推荐(9) 编辑
摘要: 对于一个Numeric属性/字段,ASP.NET MVC会自动进行数据类型的验证(客户端验证),以确保输入的是一个有效的数字,但是呈现在页面上的错误消息总是一段固定的文本:“The field {0} must be a number”,本篇提供一种解决方案使我们可以对此验证消息进行定制。 阅读全文
posted @ 2012-02-13 13:13 Artech 阅读(8281) 评论(9) 推荐(9) 编辑
摘要: 条件获取(Conditional Retrieval)旨在解决这样的问题:客户端获取某个资源并对其进行缓存,当再次获取相同资源时,如果资源数据与之前获取的一致,则不再返回真正的资源数据,而是在回复中设置一个“标识”表明获取的资源并未发生改变。 阅读全文
posted @ 2012-02-13 08:56 Artech 阅读(7956) 评论(18) 推荐(7) 编辑
摘要: ASP.NET的输出缓存(Output Caching)机制允许我们针对整个Web页面或者页面的某个部分(主要针对用户控件)最终呈现的HTML进行缓存。对于后续针对相同资源的请求,只需要直接将缓存的HTML予以回复而无须按照页面处理生命周期对每次请求进行重复处理。WCF通过操作行为AspNetCacheProfileAttribute利用ASP.NET的输出缓存提供一种针对于某个操作的声明式缓存机制。 阅读全文
posted @ 2012-02-10 08:58 Artech 阅读(7994) 评论(16) 推荐(9) 编辑
摘要: REST服务采用面向资源的架构,而资源通过URI进行标识和定位,所以URI在REST中具有重要的地位。对于WCF来说,服务调用请求的URI映射为某个具体的操作,所以服务端需要解决的是如何根据请求URI选择出对应的操作。如果采用SOAP,操作的选择是根据消息的报头来实现的,那么REST服务又采用怎样的操作选择机制呢? 阅读全文
posted @ 2012-02-09 09:13 Artech 阅读(11650) 评论(14) 推荐(12) 编辑
摘要: WCF为REST服务的寄宿提供了一个新的ServiceHost,即WebServiceHost。WebServiceHost是ServiceHost的子类,而WebServiceHostFactory是对应的ServiceHostFactory,在基于IIS/WAS寄宿中被使用。由于对REST服务绝大部分功能的支持都是通过WebHttpBehavior这么一个终结点行为实现的,所以WebServiceHost的核心功能就是将该终结点行为应用到寄宿服务的所有终结点。除此之外,WebServiceHost还具有一些额外的功能,这些功能都是通过重写OnOpening方法实现的。 阅读全文
posted @ 2012-02-08 09:00 Artech 阅读(14183) 评论(17) 推荐(15) 编辑
摘要: 可以说WebHttpBinding和WebHttpBehavior是整个Web HTTP编程模型最为核心的两个类型,前者主要解决消息编码问题,而余下的工作基本上落在了终结点行为WebHttpBehavior上。WebHttpBehavior属性HelpEnabled和AutomaticFormatSelectionEnabled是“帮助页面”与“自动消息格式选择”这两个特性的总开关。 阅读全文
posted @ 2012-02-07 08:37 Artech 阅读(15511) 评论(18) 推荐(15) 编辑
摘要: 我们知道请求消息和回复消息分别是对操作方法输入参数和返回值(输出参数和引用参数)的封装,而请求消息和回复消息的主体具有两种不同的风格,即Bare和Wrapped。的Bare表示请求消息和回复消息的主体部分仅仅包含针对输入参数和返回值(输出参数和引用参数)序列化后的内容,而Wrapped则会在外面包装一个基于当前操作的“封套”。 阅读全文
posted @ 2012-02-06 08:52 Artech 阅读(14708) 评论(23) 推荐(8) 编辑
上一页 1 ··· 8 9 10 11 12 13 14 15 16 ··· 22 下一页