摘要: 上一篇《ASP.NET性能优化之构建自定义文件缓存》我们通过OutputCache,让请求去访问服务器asp.net的输出缓存,我们扩展了OutputCacheProvider,这相当于是访问服务器上的静态资源。OutputCache是针对所有访问服务器资源的用户,本篇要介绍的浏览器缓存则是针对单个用户,让浏览器在我们的控制下彻底不持续访问服务器上的动态内容,也就是我们要让浏览器变成我们的缓存机制中的一部分,在某些特定的场景下最大化地提升ASP.NET站点的性能。如果说OutputCache是从广度上提升并发效率,则浏览器缓存是从深度上提升效率。一:HTTP头简介1.1浏览器第一次请求假设我们 阅读全文
posted @ 2011-09-13 09:26 陆敏技 阅读(10404) 评论(34) 推荐(16) 编辑
摘要: ASP.NET的输出缓存(即静态HTML)在.NET4.0前一直是基于内存的。这意味着如果我们的站点含有大量的缓存,则很容易消耗掉本机内存。现在,借助于.NET4.0中的OutputCacheProvider,我们可以有多种选择创建自己的缓存。如,我们可以把HTML输出缓存存储到memcached分布式集群服务器,或者MongoDB中(一种常用的面向文档数据库,不妨阅读本篇http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx)。当然,我们也可以把缓存作为文件存储到硬盘上,考虑到可扩展性,这是一种最廉价的做法,本文就是介绍如果构建自定义文件 阅读全文
posted @ 2011-09-08 09:21 陆敏技 阅读(9202) 评论(34) 推荐(13) 编辑
摘要: 在实际的项目中,会存在大量的自定义路由,URL很容易被错误的路由捕获,现在我们就实现一个这样的诊断工具,该工具通过实现一个自定义的IHttpModule来实现。 首先,我们创建CustomRouteHandler: public class CustomRouteHandler : IRouteHandler { public IHttpHandler GetHtt... 阅读全文
posted @ 2011-09-07 11:59 陆敏技 阅读(2629) 评论(2) 推荐(1) 编辑
摘要: 一:压力测试中需要掌握的几个基本概念1:吞吐率(Requests per second)服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。记住:吞吐率是基于并发用户数的。这句话代表了两个含义... 阅读全文
posted @ 2011-09-02 11:26 陆敏技 阅读(14482) 评论(42) 推荐(29) 编辑
摘要: 首先介绍一下几个基本概念。 一:传输速率 电信号或光信号在进入线路后,能快速传播,其速率,即传播速率。单位是m/s,即米/秒。铜线速度是2.3*10^8m/s,光纤是2.0*10^8m/s。 二:带宽 带宽指的是数据发送速度,具体依赖于总线频率和总线宽度。贷款的单位是M,如100M,指的是100Mbit/s,也即100Mbps。 三:大、小B 1字节=1Byte=1B=8bit=8b=... 阅读全文
posted @ 2011-09-01 14:18 陆敏技 阅读(7120) 评论(0) 推荐(1) 编辑
摘要: http://memcachedproviders.codeplex.com/提供的Memcached客户端支持Asp.net站点中的Session同步,其原理是接管Asp.net的Session处理,同时在后台使用数据库支持完成WEB集群的Session的同步。具体实现步骤如下:1:数据库准备下载完毕Memcached providers之后,在解压目录下有:一个用于创建数据库表,一个用于创建这个provider的需要用到的存储过程。2:配置sessionStatesessionState的配置如下,为了完整性期间,这里给出Web.config的全部配置部分,包括分布式缓存的Memcache 阅读全文
posted @ 2011-08-17 17:40 陆敏技 阅读(2957) 评论(4) 推荐(1) 编辑
摘要: Memcached的Windows版本在这里下载http://code.google.com/p/memcached/wiki/PlatformWindows(或http://memcachedproviders.codeplex.com/),最高的版本是1.4.4,但是已经很难在网上下载到。不过http://www.couchbase.com/对Memcached进行了很好的维护,但是这个团队把Memcached封装进了自己的产品中(1.4.4也是由这个团队开发的,但是它们已经移除了1.4.4的Memcached的独立分支)。我没有试过couchbase的产品,故本例针对1.2.6(你也可以 阅读全文
posted @ 2011-08-17 16:40 陆敏技 阅读(6304) 评论(2) 推荐(0) 编辑
摘要: 1:MEF核心概念 可组合的部件(或简称“Part”)— 一个部件向其他部件提供服务,或使用其他部件提供的服务。MEF 中的部件可来自任何位置(应用程序内部或外部);从 MEF 的角度来看,这并无区别。 导出 — 导出是部件提供的服务。某个部件提供一个导出时,称为该部件导出 该服务。 导入 — 导入是部件使用的服务。某个部件使用一个导入时,称为该部件导入 该服务。 约定 — 约定是导出或导入的标识符。导出程序指定其提供的字符串约定,导入程序指定其需要的约定。MEF 从要导出和导入的类型派生约定名称,因此在大多数情况下,您不必考虑这一点。 组合 — 部件由 MEF 组合,MEF 将部件实例化,然 阅读全文
posted @ 2011-08-16 16:57 陆敏技 阅读(1012) 评论(1) 推荐(0) 编辑
摘要: 在MOQ中,It用于添加参数约定,它有以下几个方法:Is<T>:匹配确定的给定类型IsAny<T>:匹配给定的任何值IsInRange<T>:匹配给定类型的范围IsRegex<T>:正则匹配还是以上文中的例子: public abstract class CounterBase { public abstract int CountArgs(int a, int b); }测试代码: Mock<CounterBase> mock = new Mock<CounterBase>(); mock.Setup(arg => 阅读全文
posted @ 2011-08-16 16:55 陆敏技 阅读(673) 评论(0) 推荐(0) 编辑
摘要: MOQ来自于http://code.google.com/p/moq/。下载后其实是直接作为DLL被引用的。Mock是模拟对象的一种技术。它可以用于以下情况:----- 真实对象具有不可确定的行为(产生不可预测的结果,如股票的行情)----- 真实对象很难被创建(比如具体的web容器)----- 真实对象的某些行为很难触发(比如网络错误)----- 真实情况令程序的运行速度很慢----- 真实对象有用户界面----- 测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)----- 真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一 阅读全文
posted @ 2011-08-15 09:33 陆敏技 阅读(1752) 评论(0) 推荐(0) 编辑
摘要: 基于以下的理由,ViewModel也是需要多个,并且需要被注入的:1:设计时和运行时需要为View提供不同的数据简单来说,就是设计时需要模拟数据。界面设计开发人员需要进行绑定(包括支持Expression Blend绑定)做一些简单的处理,同时因为提供了模拟数据,UI人员可以更好的设计实际的界面。2:为了方便单元测试在运行时,大部分情况下,ViewModel会组合进提供Service的业务类。在简单的应用中,我们可以注入Service类的MOCK来进行单元测试,如果是这样,就可以避免提供多个ViewModel。但在有些应用中,如Silverlight应用中,服务由WerbService、WCF 阅读全文
posted @ 2011-08-11 09:09 陆敏技 阅读(4930) 评论(4) 推荐(0) 编辑
摘要: 上篇讲到了3种注入的方式,注入的对象都是由Unity为我们自动创建的。有时候我们需要注入已经存在的对象。 代码如下: //使用已有实例注入 ISomeBiz someBiz = container.Resolve<ISomeBiz>("ConfigBiz"); someBiz.SomeInt = 101; IClass class11 = container.Resolve<IClass>("Co... 阅读全文
posted @ 2011-08-08 15:53 陆敏技 阅读(779) 评论(0) 推荐(0) 编辑
摘要: 1:本篇基于如下的场景a:主项目只和接口项目相关,如下:也即,ConsoleApplication1只和IBiz和IDal相关。顺便说一下,为了演示注入,IDal要用到IBiz项目。b:类结构如下:SampleClass1,SampleClass2,SampleClass3,都继承自IClass其中SampleClass1构造器依赖注入ISomeBiz的一个实例,其中SampleClass2属性依赖注入ISomeBiz的一个实例,其中SampleClass3方法依赖注入ISomeBiz的一个实例。c:用配置文件实现2:主要的类两个接口,一个是在IDal项目下的IClass: public in 阅读全文
posted @ 2011-08-08 15:25 陆敏技 阅读(2698) 评论(4) 推荐(1) 编辑
摘要: Unity属于微软企业库的一部分,你可以到http://entlib.codeplex.com/去下载企业库并安装。为了介绍Unity,应该首先明白两个概念(见[EntLib]微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART1——为什么要使用Unity?)。1、IOC(Inversion of Control )——反转控制,根据其字面意思我们就可以知道就是将控制权反转出去。在我们以往开发代码的过程中每一层都紧紧地联系在一起,一层依赖一层,如果一层发生了变化那就会导致其他层也发生连锁反应,例如:业务逻辑层(BLL)依赖于数据访问层(DAL),一般都是直接创建数据访问层 阅读全文
posted @ 2011-08-05 21:21 陆敏技 阅读(1361) 评论(6) 推荐(1) 编辑
摘要: 级联菜单最有名的是省市级联,如果你还没有这样的数据库,请从这里下载Province.rar。 1:MODEL 准备3个Model,如下: public class Province { public int id { get; set; } public string provinceID { get; set; } public string province { get; set; } } p... 阅读全文
posted @ 2011-08-01 15:59 陆敏技 阅读(2039) 评论(2) 推荐(1) 编辑
摘要: 在上一篇《MVC TIP4:为捕获路由及通用异常处理》里,我们讲了如何捕获MVC WEB站点的未捕获异常,这里我们还要解决一个问题,就是JQuery Ajax异常的捕获。Ajax异常的捕获仍旧需要借助于全局的ErrorController控制器,及其视图,在Views的Error文件夹下的Index视图。 我们知道,一个Ajax调用,通常像如下的形式: 如果调用出错,也就是调用CityContro... 阅读全文
posted @ 2011-08-01 11:24 陆敏技 阅读(2807) 评论(0) 推荐(0) 编辑
摘要: 对于未路由到的URL,可以如下处理。 1:首先,准备控制器 public class ErrorController : Controller { public ActionResult Index(string error) { ViewData["Title"] = "WebSite 网站内部错误"; ViewData["Description"] = error; return View("... 阅读全文
posted @ 2011-07-31 10:18 陆敏技 阅读(1907) 评论(2) 推荐(1) 编辑
摘要: 在开始介绍使用JQuery提交表单之前,先看一下非Ajax提交表单的形式,如下:1:非Ajax前台:对应后台:2:JQuery之Ajax在介绍使用JQuery提交表单前,我们需要首先引用jquery.form.js,它来自于http://www.malsup.com/jquery/form/,至此,我们需要引用的JS文件有:功能要求:Ajax提交表单,在控制器HelloWorld4Controller中处理请求,并返回若干数据,数据格式为JSON。首先,我们假设返回的JSON实体为: public class LoginResultDTO { public bool Success { get 阅读全文
posted @ 2011-07-31 09:03 陆敏技 阅读(5292) 评论(1) 推荐(0) 编辑
摘要: 1:简单路由建立MVC的时候会给我们创建默认的路由,如下: routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults );表示假设你在浏览器的地址栏输入了下面的URL:/Home/Index/3默 阅读全文
posted @ 2011-07-27 17:31 陆敏技 阅读(1100) 评论(0) 推荐(1) 编辑
摘要: 1:默认的控制器映射该控制器映射,可以支撑常规的路径;默认约定是在匹配/Views/controllername/actionname.aspx的目录中查找一个aspx文件。2:IController接口所有的控制器最终都是继承自这个接口,一个最简单的控制器:3:Controller基类控制器可以有一个唯一的基类为Controller,一个简单的这样的控制器如下:根据映射,在前台地址输入:http://localhost:52588/Default1/就可以显式Index返回类型的ToString()结果。如上文中,注释的第一段,返回的是abc,注释的第二段,返回的是2,而Student返回的 阅读全文
posted @ 2011-07-27 11:43 陆敏技 阅读(771) 评论(1) 推荐(1) 编辑
Web Counter
Coupon for Contacts