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などの関連サブクラスのドキュメントを参照してください.
WebRequestクラスを理解したら、残りは簡単です.次のコードを見てください.
.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を継承するクラスをカスタマイズする必要があります.コードは次のとおりです.
.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を加えることができます.
特徴:ページの最初のブラウズ時にHTMLを生成することができて、必要に応じて生成することができて、効率的に比較的に良いです.このFilterを大面積のページにロードする必要がある場合は、IHttpHandlerFactoryまたはIHttpModuleを使用します.
三、Page.Render
この方法も比較的簡単で、HTMLを保存する目的を達成するためにPageのRenderメソッドを書き換えます.コードは次のとおりです.
.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ファイルを生成する
一、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書き換えスキームなどには触れず,後で議論する.
解決すべき疑問点: