新闻详情  

 首页>行业知识>Asp.net中如何过滤掉html标签里的空格:使用空格过滤器

Asp.net中如何过滤掉html标签里的空格:使用空格过滤器 发布时间:2016-11-16

       对于服务器发送给客户端动态生成的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)提供,转载请注明出处,谢谢!

 

执照号:[310114002390097] 沪ICP备案号:[沪ICP备11049975号-12]  投诉电话:15316876263