我经常在赞叹ASP.NET,它整体的架构实在是幽雅 。它的基于组件,可扩展的设计,可以让我们专注于某一方面的工作。这样,业务编写人员可以专注于业务代码的编写而不用关心系统的权限设计,系统优化人员专注于系统优化而不用关心业务逻辑;对于一些经常用到的组件,我们可以抽象成用户控件或自定义控件。但是,话又说回来,如果一个人对ASP.NET的理解仅仅局域在Page_Load, Button_Click的代码编写,他永远也无法理解如何进行基于组件的,可扩展的编写代码。这样的人在团队里,只会一味的反对优秀架构师设计出来的解决方案,因为他们除了Page_Load, Button_Click,对ASP.NET一无所知。
现在主流的Web浏览器都支持gzip压缩,所以,在Web服务器程序的开发过程中,如果一个页面生成的Html文件很大,在传输之前对其进行gzip压缩,可以大大的减小输出的体积,加快传输的效率,对用户的体验也大大增加。所以,有必要对Web页面的输出进行压缩。
为ASP.NET程序添加gzip压缩功能,其实非常简单,不用修改任何一行页面逻辑代码。只要添加一个HttpModule来处理相关的输出就可以了。当然重新写一个iis api扩展也是可取的。开源的博客系统BlogEngine.NET中有一个专门支持页面压缩的模块,里面的设计很简单,也很实用。主要的思路是:修改HttpResponse的Filter,对http输出流进行压缩处理。下面是该模块的主要代码:
/// /// 在模块初始化的时候,给PreRequestHandlerExecute事件添加回调。 /// void IHttpModule.Init(HttpApplication context) { if (BlogSettings.Instance.EnableHttpCompression) { context.PreRequestHandlerExecute += new EventHandler(context_PostReleaseRequestState); } }
下面是回调函数的实现,主要看CompressResponse(context); 这一行代码就可以了。
/// /// 回调。 /// void context_PostReleaseRequestState(object sender, EventArgs e) { HttpContext context = ((HttpApplication)sender).Context; if (context.CurrentHandler is System.Web.UI.Page
&& context.Request["HTTP_X_MICROSOFTAJAX"] == null && context.Request.HttpMethod == "GET") { //设置对输出流进行压缩。 CompressResponse(context); if (BlogSettings.Instance.CompressWebResource) context.Response.Filter = new WebResourceFilter(context.Response.Filter); } else if (!BlogSettings.Instance.CompressWebResource && context.Request.Path.Contains("WebResource.axd ")) { context.Response.Cache.SetExpires(DateTime.Now.AddDays(30)); } }
下面是CompressResponse的实现:
/// /// 对输出进行压缩。 /// public static void CompressResponse(HttpContext context) { if (IsEncodingAccepted(DEFLATE)) { context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress); SetEncoding(DEFLATE); } else if (IsEncodingAccepted(GZIP)) { context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress); SetEncoding(GZIP); } }
代码非常的简单,并且对原有系统的代码一行也没有修改,做到了真正的可扩展。而且这也符合AOP的思想。
在实际的开发过程中,有很多人喜欢把所有的代码写到aspx.cs页面里,如权限验证。其实我很反对这样做,因为这样会使整个系统像一碗杂酱面一样,任何东西都仅仅的藕合在一起,很难维护。