对于服务器发送给客户端动态生成的HTML,可以通过移除多余的空格减少该HTML的大小,这跟缩小Javascript大小的原则是一致的,现在将其应用到动态生成的HTML上,你也许会惊奇的发现,某些HTML页面居然包含如此多的额外空格。
第一步是写一个过滤器,对Page的输出流做适当的处理。可以使用Stream接口实现该过滤器,最有趣也是最主要的方法是Write(),它的输入是一个字节数组,一个偏移量以及一个计数。实际上,运行时不会一次写入该页面的所有输出,所以需要记录一个调用到下一个调用的一些状态信息。
最终的代码太大了,没有必要全部示例出来,下面列出的是所需的框架:
using System;
using System.IO;
using System.Text;
namespace Sample
{
Public class MinifyStream:Stream
{
Private StreamWriter Writer{get; set;}
Private Decoder Utf8Decoder {get; set;}
Public MinifyStream(Stream stream)
{
this.Writer=new StreamWriter(stream,Encoding.UTF8);
this.Utf8Decoder=Encoding.UTF8.GetDecoder();
}
该类从Stream继承,构造器将提供的Stream包装在一个新StreamWriter中,使用UTF-8编码。
Public override void Writer(byte[] buffer,int offset,int count)
{
......
}
Write()方法会将输入字节数组作为UTF-8字符处理。这里的算法会过滤掉多余的空格,并将过滤后的输入写到this.Write中,其中考虑到缓冲边界可能不在一个线性边界上。
应该覆盖Read(),SetLength()以及Seek()方法,让其抛出NotImplementedException异常,因为这是一个只写、只进的Stream。同样,还应该覆盖Position和Length属性,抛出InvalidOperationException.
Public override void Flush();
{
This.Write.Flush();
}
Public override bool CanWrite
{
Get{ return true;}
}
Public override bool CanSeek
{
Get{ return false;}
}
Public override bool CanRead
{
Get{return false;}
}
Public override void Close()
{
this,Write.Flush();
this.Write.Close();
base.Close();
}
上面显示的是剩下的属性和方法,提供了很直接的覆盖。
有了过滤器类,下一步就是将其连在一起。在一个HttpModule(比如在本章前面给出的那个例子中一样)中,为 PostRequestHandlerExecute事件创建并绑定一个新的事件处理器,表示该处理器会在页面处理器执行完成后运行。
Private void Sample_PostRequestHandlerExecute(object source,EventArgs e)
{
HttpApplication application=(HttpApplication) source;
HttpResponse response=application.Context.Response;
If(response.ContentType==”text/html”)
Response.Filter=new MinifyStream(response.Filter);
}
我们只想将该过滤器应用到HTMl输出上,上面的代码只会从HTML中移除空格,不会做其他任何工作。我们可以通过查看Respnse.ContentType检查是否是HTML,Response.ContentType包含了输出的MIME类型。
整个工作的最后一步就是将该过滤器的新实例分配给Response.Filter。这会告诉运行时调用过滤器代码输出该页面。将旧过滤器的引用作为参数传递给新过滤器的构造器,这样过滤器的类就知道在移除额外的空格后将输出发送到何处。本文由上海蓝友信息科技有限公司(www.lanyousoft.com)提供,转载请注明出处,谢谢!