[ASP.NET]HttpModuleによる動的Webページコンテンツフィルタリング

2529 ワード

ターゲット


Webリクエストの動的コンテンツを文字列フィルタリングすることを実現します.たとえば、すべてのコメントや空の行を削除したり(自分で構成できます)、HTML出力ストリームを圧縮したりして、トラフィック消費を削減することができます.

前言


HttpModuleとその役割については、自分で関連記事を探すことができます.本稿では,HttpModuleの実用化により,サーバの動的処理要求プロセスの理解を深めることを目的とする.その中で、ネット上の何人かの大侠の処理構想を参考にして、同時に自分の実際と結びつけて、自分の方法を編んだ.もちろんもっと適切な処理方法があるに違いないが、縁があってこの文章を見ることができる友达が教えてくれることを望んで、その中の不当なところに対して、指摘できれば、感謝しきれない.

HttpModuleの作成

  • 最初のステップを開始し、プロジェクトに新しいクラスHttpFilterModuleを追加し、IHttpModuleクラスのインタフェースを実現し、HttpFilterModuleと命名する.cs、デフォルトはApp_コードフォルダにあります.
  • IHttpModuleでは、Init(HttpApplicationアプリケーション)という2つのインタフェース関数を実装する必要があります.ここで、HttpApplicationタイプを入力パラメータとし、具体的な実装が必要であり、主な実装方法でもあります.一つはDispose()であり,パラメータはなく,ここでは具体的な実装方法は必要ない.HttpFilterModule.csファイルの内容は以下の通りである:
    using System;
    using System.Web;
    using System.Web.Configuration;
    
    /// 
    /// HTTP       
    /// 
    public class HttpFilterModule : IHttpModule
    {
      public HttpFilterModule(){}
      public void Init(HttpApplication application)
      {
        //TODO:           
      }
      public void Dispose() { }
    }
    主なHttpModuleが確立され、現在必要なのは実現方法である.しかし、今ではもう一つの重要なオブジェクトに関連しています.Response.Filter、IntelliSenseの迅速な情報で見ることができます.Response.FilterオブジェクトはSystemに属する.IO.Streamオブジェクトは、「送信前にHTTPエンティティ本体を変更するためのパッケージフィルタオブジェクトを取得または設定します.」したがって,変更(設定)によりオブジェクトを変更することで,HTTPエンティティ本体コンテンツをフィルタリングする目的が達成できることが分かる.

  • RawFilterフィルタの作成

    Response.FilterオブジェクトはSystemに属する.IO.Streamオブジェクトを変更するには、元のフィルタオブジェクトを作成してStreamオブジェクトを継承し、Streamオブジェクトを書き換えるWrite()メソッドで出力オブジェクトを変更し、最後に書き換えたStreamストリームオブジェクトをResponseに割り当てます.Filterオブジェクトでいいです.詳細:新規
    RawFilter.csファイル、デフォルトはApp_Codeフォルダで、ダブルクリックして次のコードを入力します.
    using System;
    using System.IO;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Web;
    using System.Xml.XPath;
    
    /// 
    ///         ,         
    /// 
    public class RawFilter : Stream
    {
      Stream responseStream;
      HttpRequest request;
      long position;
      StringBuilder responseHtml;
    
      /// 
      ///      
      /// 
      ///    
      public RawFilter(Stream inputStream, HttpRequest httpRequest)
      {
        responseStream = inputStream;
        responseHtml = new StringBuilder();
        request = httpRequest;
      }
      //    , HttpResponse        ,            ,            (  )
      public override void Write(byte[] buffer, int offset, int count)
      {
        string strBuffer = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
    
        //       ,