ASP.NET 2.0 HTMLを生成する3つの方法

10257 ワード

データベース駆動のダイナミックWEBページは,我々プログラマを煩わしい検索置換から解放したが,何事にも利害があり,我々の仕事を減らしたが,サーバの負担を増大させたため,様々な静的ページ生成方法が育まれた.本文はただ私の知っているいくつかのASPを簡単に述べてまとめただけです.NETスタティックページ生成技術は、不適切な点があれば、含めてご指導ください.
  • この文書のダウンロード

  • 一、WebRequest
    まずMSDN対Systemを見てみましょう.Net.WebRequestの解釈でしょう.
    WebRequestはNET Frameworkのリクエスト/レスポンスモデルのabstractベースクラスで、インターネットデータにアクセスします.この要求/応答モデルを使用するアプリケーションは、インターネットからプロトコルが知らない方法でデータを要求することができ、この方法では、アプリケーションはWebRequestクラスのインスタンスを処理し、プロトコル固有のサブクラスは要求の具体的な詳細を実行する.
    サーバ上のWebページなど、アプリケーションから特定のURIへの送信を要求します.URIは、アプリケーションに登録されたWebRequest子のリストから、作成する適切なサブクラスを決定します.WebRequest子の登録は、通常、HTTPやFTPなどの特定のプロトコルを処理するために行われますが、特定のサーバまたはサーバ上のパスの要求を処理するために登録することもできます.
    インターネットリソースへのアクセス中にエラーが発生した場合、WebRequestクラスによってWebExceptionが発生します.WebException.Statusプロパティは、WebExceptionStatusの値の1つであり、エラー・ソースを示します.その時StatusはWebExceptionStatusです.ProtocolErrorの場合、Responseプロパティにはインターネットリソースから受信したWebResponseが含まれます.
    WebRequestクラスはabstractクラスであるため、WebRequestインスタンスの実行時の実際の動作はSystemによる.Net.WebRequest.Createメソッドが返すサブクラス決定.デフォルト値と例外の詳細については、HttpWebRequestやFileWebRequestなどの関連サブクラスのドキュメントを参照してください.http://またはhttps://が入力されると、CreateはHttpWebRequestオブジェクトを返します.file://の場合、CreateメソッドはFileWebRequestオブジェクトを返します.NET Frameworkは、http://https://およびfile:// URIスキームのサポートを含む.RegisterPrefixメソッドを使用して、他のリクエストを処理するカスタムWebRequestサブクラスを登録します.
    WebRequestクラスを理解したら、残りは簡単です.次のコードを見てください.
    //    URL
    
    System.Net.WebRequest request = System.Net.WebRequest.Create(url);
    
    //     
    
    WebResponse response = request.GetResponse();
    
    //        StreamReader 
    
    StreamReader sr = new StreamReader(response.GetResponseStream());
    
    
    
    StreamWriter sw = new StreamWriter(path, false, System.Text.Encoding.Default);
    
    //     
    
    sw.Write(sr.ReadToEnd());
    
    sw.Close();
    
    sr.Close();

    .csharpcode{ background-color: #eee; border:1px solid #ccc; padding:5px;}
    .csharpcode, .csharpcode pre
    {
    font-size: 1em;
    color: black;
    font-family: "Courier New", courier, monospace;
    /*white-space: pre;*/
    }
    .csharpcode pre { margin: 0em; }
    .csharpcode .rem { color: #008000; }
    .csharpcode .kwrd { color: #0000ff; }
    .csharpcode .str { color: #006080; }
    .csharpcode .op { color: #0000c0; }
    .csharpcode .preproc { color: #cc6633; }
    .csharpcode .asp { background-color: #ffff00; }
    .csharpcode .html { color: #800000; }
    .csharpcode .attr { color: #ff0000; }
    .csharpcode .alt
    {
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
    }
    .csharpcode .lnum { color: #606060; }
    特徴:URLは私たち自身が入力したので、どんなプログラム、どんなウェブサイトのページをつかむことができます.一括してHTMLやスリプログラムを生成するために、全体的なバックグラウンドページやWin formプログラムを作成することができます.
    二、Response.Filter
    相変わらず、MSDNの説明を見てみましょう.
    Response.Filter:HTTPエンティティ本体を転送する前に変更するパッケージフィルタオブジェクトを取得または設定します.Streamオブジェクトを作成し、FilterプロパティをStreamオブジェクトに設定すると、Writeから送信されたHTTP出力はすべてフィルタを通過します.
    名前の通りFilterはフィルタであり、コード出力の前に追加の操作を行うことができます.まず、Streamを継承するクラスをカスタマイズする必要があります.コードは次のとおりです.
    public class ResponseFilter : Stream
    
    {
    
        private Stream m_sink;
    
        private long m_position;
    
        private FileStream fs;
    
    
    
        public ResponseFilter(Stream sink, string filePath)
    
        {
    
            m_sink = sink;
    
            //       
    
            fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
    
        }
    
        public override void Write(byte[] buffer, int offset, int count)
    
        {
    
            //      browser
    
            m_sink.Write(buffer, 0, count);
    
            //        
    
            fs.Write(buffer, 0, count);
    
        }
    
    
    
        //      
    
        public override bool CanRead { get { return true; } }
    
        public override bool CanSeek { get { return false; } }
    
        public override bool CanWrite { get { return false; } }
    
        public override long Length { get { return 0; } }
    
        public override long Position { get { return m_position; } set { m_position = value; } }
    
        public override long Seek(long offset, System.IO.SeekOrigin direction) { return 0; }
    
        public override void SetLength(long length) { m_sink.SetLength(length); }
    
        //   fs.Close()
    
        public override void Close() { m_sink.Close(); fs.Close(); }
    
        public override void Flush() { m_sink.Flush(); }
    
        public override int Read(byte[] buffer, int offset, int count) { return m_sink.Read(buffer, offset, count); }
    
    }

    .csharpcode{ background-color: #eee; border:1px solid #ccc; padding:5px;}
    .csharpcode, .csharpcode pre
    {
    font-size: 1em;
    color: black;
    font-family: "Courier New", courier, monospace;
    /*white-space: pre;*/
    }
    .csharpcode pre { margin: 0em; }
    .csharpcode .rem { color: #008000; }
    .csharpcode .kwrd { color: #0000ff; }
    .csharpcode .str { color: #006080; }
    .csharpcode .op { color: #0000c0; }
    .csharpcode .preproc { color: #cc6633; }
    .csharpcode .asp { background-color: #ffff00; }
    .csharpcode .html { color: #800000; }
    .csharpcode .attr { color: #ff0000; }
    .csharpcode .alt
    {
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
    }
    .csharpcode .lnum { color: #606060; }
    そしてHTMLを生成する必要があるページにこのFilterを加えることができます.
    //  ,   Response.Filter       HTML 
    
    Response.Filter = new ResponseFilter(Response.Filter, path);

    特徴:ページの最初のブラウズ時にHTMLを生成することができて、必要に応じて生成することができて、効率的に比較的に良いです.このFilterを大面積のページにロードする必要がある場合は、IHttpHandlerFactoryまたはIHttpModuleを使用します.
    三、Page.Render
    この方法も比較的簡単で、HTMLを保存する目的を達成するためにPageのRenderメソッドを書き換えます.コードは次のとおりです.
    protected override void Render(HtmlTextWriter writer)
    
    {
    
        //     Render  ,     writer 
    
        //base.Render(writer);
    
    
    
        StringWriter html = new StringWriter();
    
        HtmlTextWriter tw = new HtmlTextWriter(html);
    
        //  base.Render()  ,    HTML        tw 
    
        base.Render(tw);
    
    
    
        string path = Server.MapPath("~/html/Render_" + Guid.NewGuid() + ".html");
    
        StreamWriter sw = new StreamWriter(path, false, System.Text.Encoding.Default);
    
        //      
    
        sw.Write(html.ToString());
    
        sw.Close();
    
        //   writer ,      HTML
    
        //  ,       base.Render(writer),     
    
        writer.Write(html.ToString());
    
    }

    .csharpcode{ background-color: #eee; border:1px solid #ccc; padding:5px;}
    .csharpcode, .csharpcode pre
    {
    font-size: 1em;
    color: black;
    font-family: "Courier New", courier, monospace;
    /*white-space: pre;*/
    }
    .csharpcode pre { margin: 0em; }
    .csharpcode .rem { color: #008000; }
    .csharpcode .kwrd { color: #0000ff; }
    .csharpcode .str { color: #006080; }
    .csharpcode .op { color: #0000c0; }
    .csharpcode .preproc { color: #cc6633; }
    .csharpcode .asp { background-color: #ffff00; }
    .csharpcode .html { color: #800000; }
    .csharpcode .attr { color: #ff0000; }
    .csharpcode .alt
    {
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
    }
    .csharpcode .lnum { color: #606060; }
    特徴:煩わしい.:-(
    四、まとめ
    以上より、ASP.NETでHTMLを生成するのは簡単で便利なので、1つ目と2つ目をお勧めします.カスタムテンプレートをテキストに置き換える方法については,ASPで使用することが多いが,面倒であるため,ここでは議論しない.
    本稿では,HTMLを生成するための基本的な手法をいくつか示しただけで,具体的な使用における各種生成戦略,URL書き換えスキームなどには触れず,後で議論する.
    解決すべき疑問点:
  • 生成されたHTMLページをブラウズする場合、ViewStateはどのように処理するか(捨てるか......)
  • ページPostBackはどのように処理しますか(PostBackではありませんか......)
  • 参考資料:
  • MSDN
  • How to freeze a dynamic aspx page into a static html page (on the server)
  • [2007最後のブログ]Urlアドレスを書き換え、HttpHanderでページを手動でコンパイルし、必要に応じて静的HTMLファイルを生成する