ASP.NET 3.5コアプログラミング学習ノート(30):HttpResonseオブジェクト

7817 ワード

ASP.NETでは、HTTP応答情報をHttpResonse類でカプセル化しています.このクラスの例は、処理要求のHTTPパイプラインが確立されたときに作成され、その後、このインスタンスは要求に関連するHttpContectオブジェクトにリンクされ、そのResonse属性によって露出される.ユーザー定義のASP.NETコードは、HttpResonseの構造関数を使用する必要はないが、この関数は、このクラスの本質を理解するのに役立つ.

  
  
public HttpResponse(TextWriter writer);
このコンストラクタは、応答テキストを格納するためのTextWriterオブジェクトを受け入れることが分かる.Response.Writeへの呼び出しは、TextWriterオブジェクトへの呼び出しに変換されます.
HttpResonse類の属性
以下の表には、HttpResonseクラスの属性が一覧されています.
ASP.NET 3.5核心编程学习笔记(30):HttpResponse对象_第1张图片
ASP.NET 3.5核心编程学习笔记(30):HttpResponse对象_第2张图片
キャッシュポリシーの設定に応答します.
ブラウザに送信され、キャッシュされたページには、応答オブジェクトが3つの制御属性があります.ExpressとExpresAbsoluteのプロパティは、それぞれ相対時間と絶対時間を定義するために使用されます.その時、クライアントキャッシュのページが期限切れになります.ブラウザはこれを使用しないで、お客様のためにサービスを要求します.実際には、ユーザーが現在キャッシュされているページにナビゲートすれば、キャッシュバージョンはサーバと対話することなく表示されます.キャッシュに関する第三の属性は、CachControlである.この属性は特殊なHTTPヘッダ、すなわちCache-Coontrolを設定するために使用される.このヘッダは、ドキュメントのネットワーク間のキャッシュ方式を制御するために使用される.これらの属性賭けは旧式のASPプログラミングのスタイルです.
AS P.NETでは、キャッシュ機能はすべてHttpCachePolicy類で設定されています.ページのキャッシュに対して、このクラスは二重の役割を果たしている.このクラスで提供する方法は、キャッシュ特定のHTTPヘッダを設定するためのものと、ASP.NETページ出力キャッシュを制御するためのものとがあります.
クライアントキャッシュ中のページの視認性を設定するために、HttpCachePolicy類のSetCachebility方法が使用されます.Set Expires方法は、絶対的なDateTimeオブジェクトを受け入れる期限切れ時間を設定するために使用されます.キャッシュページの生存期間を設定するには、現在の時間に予定の間隔を加えて、SetExpiresに入力すればいいです.
キャッシュポリシーの衝突が発生すると、ASP.NETは最強の設定を採用します.例えば、ページに2つのコントロールが含まれている場合、それぞれCache-CoontrolヘッダをPublicとPrivateに設定すると、最強を制限するポリシーが採用されます.本例では、Cache-Coontrol:Privateはクライアントに送信されます.
出力フィルタの設定
応答フィルタは、Streamから派生したオブジェクトであり、HttpResonseオブジェクトに関連している.このオブジェクトはページの出力を監視し、フィルタすることができます.Filter属性をStreamクラスから派生したインスタンスに設定すると、すべての下部のHTTPアクチュエータに書き込まれる出力は、事前にこの出力フィルタによって行われる.
カスタムフィルタが設定されている場合、HttpResonseのFushメソッドの実行中に実際のテキストがクライアントに送信される前に呼び出します.出力フィルタはマークを最後の処理に適しています.コントロールが生成したタグを圧縮または修正するためによく使われます.
応答フィルタを構築するとは、新しいジャンルを作成し、いくつかの方法を書き換えることです.このクラスにはStreamオブジェクトを受け入れる構造関数があるべきです.したがって、応答フィルタクラスは、ストリームに継承されるクラスだけでなく、パッケージクラスです.Reponse.FilterにMemoryStreamまたはFileStreamのようなクラスのインスタンスを直接付与すると、異常な出力があります.
次のコードは、応答フィルタとしてのストリームクラスの作成方法を示しています.簡単にするために、クラスはMemoryStreamに引き継がれます.このクラスは小文字を大文字に変換できます.

  
  
public class MyFilterStream : MemoryStream
{
private Stream m_Stream;

public MyFilterStream(Stream filterStream)
{
m_Stream
= filterStream;
}

// the write method actually does the filtering
public override void Write( byte [] buffer, int offset, int count)
{
// Grab the output as a string
string buf = UTF8Encoding.UTF8.GetString(buffer, offset, count);

// Change lowercase chars to uppercase
buf = buf.ToUpper();

// Write the resulting string back the response stream
byte [] data = UTF8Encoding.UTF8.GetBytes(buf.ToString());
m_Stream.Write(data,
0 , data.Length);
}
}
次のコードで出力フィルタとReponse.Filterのプロパティを関連付けることができます.

  
  
void Page_Load( object sender, EventArgs e)
{
Response.Filter
= new MyFilterStream(Response.Filter);
}
応答フィルタは、開発者が強力な機能を持つアプリケーションを構築するのに役立つが、このような方法を選ぶには慎重でなければならない.不注意に使用すると、ビューの状態と内部スクリプトコード(両方とも、大文字と小文字を区別するテキストを含むことがあります)に影響を与え、ページの出力効果を大きく損ないます.
また、単一のページにフィルタを有効にする必要があります.ウェブサイトのすべてのページを選別する必要があるなら、HTTPモジュールを作成するのが一番いいです.
HttpResonse類の方法
以下の表には、すべてのHttpResonse類の方法が一覧されています.
ASP.NET 3.5核心编程学习笔记(30):HttpResponse对象_第3张图片
ASP.NET 3.5核心编程学习笔记(30):HttpResponse对象_第4张图片
大型ファイルの転送
HttpResonse類には、大きなファイルを出力ストリームに定着させる方法が3つあります.BinaryWrite、WriteFile、Transmittle.TransmittFile方法はこの3つの方法の中で最も安定し、最も信頼できるものです.
大きなファイルを転送する場合、WriteFileとBinaryWrite方法はWebサーバのメモリに圧力をかけます.どうしてですか?この2つの方法は、データブロック全体(ファイルまたはバイト配列の内容)をWebサーバのメモリにロードするためである.大きなファイルに対して、これは深刻なメモリ問題を引き起こし、ASP.NET自身に回収を迫る.TransmittFile方法は、ISAPI拡張に多くの文字列を送信することなく、ファイルから直接ASP.NET ISAPIに出力を送信することができる優雅にこの問題を解決することを目的としている.
TransmiitFileは、大きなファイルのダウンロードをより安定させることができますが、断続的な継続はサポートされていません.ある原因でダウンロードが失敗したら、転送を再開するしかないです.