ASP.NET Web Forms は、 Web アプリケーション フレームワークであり、 Microsoft ASP.NETテクノロジーでサポートされている複数のプログラミング モデルの 1 つです。Web Forms アプリケーションは、 C#やVisual Basicなど、共通言語ランタイムをサポートする任意のプログラミング言語で記述できます。Web Forms ページの主な構成要素はサーバー コントロールであり、これはHTMLマークアップのレンダリングとイベントへの応答を担当する再利用可能なコンポーネントです。[ 1 ]ビュー ステートと呼ばれる手法を使用して、通常はステートレスなHTTPリクエスト間でサーバー コントロールの状態を保持します。[ 2 ]
Web Forms は、 2002 年の.NET Framework 1.0 リリースに含まれており( .NET Framework のバージョン履歴とASP.NET のバージョン履歴を参照)、ASP.NET で利用可能な最初のプログラミング モデルでした。新しい ASP.NET コンポーネントとは異なり、Web Forms はASP.NET Coreではサポートされていません。[ 3 ]
ASP.NET Web ページ(正式には Web フォームと呼ばれる)[ 4 ]は、MVC が導入される以前の ASP.NET アプリケーション開発の主要な構成要素でした。[ 5 ] Web フォームには、Web アプリケーション形式と Web サイト形式の 2 つの基本的な方法論があります。[ 6 ] Web アプリケーションはデプロイ前にコンパイルする必要がありますが、Web サイトでは、コンパイルせずにファイルをサーバーに直接コピーできます。Web フォームは ".aspx" 拡張子のファイルに格納されます。これらのファイルには通常、静的 ( X ) HTMLマークアップまたはコンポーネント マークアップが含まれます。コンポーネント マークアップには、フレームワークまたは Web ページで定義されたサーバー側 Web コントロールとユーザー コントロールを含めることができます。たとえば、テキスト ボックス コンポーネントは、ページ上で として定義でき、これは HTML 入力ボックスにレンダリングされます。さらに、サーバー上で実行される動的コードは、 PHP、JSP、ASPなどの他の Web 開発技術と同様に、ブロック内に配置できます。ASP.NET Framework 2.0では、Microsoft は新しいコードビハインドモデルを導入しました。これにより、静的テキストは .aspx ページに残り、動的コードは .aspx.vb、.aspx.cs、または .aspx.fs ファイル (使用するプログラミング言語によって異なります) に記述できるようになりました。[ 7 ]<asp:textboxid="myid"runat="server"><%--dynamiccode--%>
Microsoft は、動的なプログラム コードを別のファイルまたは専用のスクリプト タグに配置するコード ビハインド モデルを使用して処理することを推奨しています。コード ビハインド ファイルの名前は通常「MyPage.aspx.cs」や「MyPage.aspx.vb」のようになり、ページ ファイルはMyPage.aspx (ページ ファイル (ASPX) と同じファイル名ですが、末尾の拡張子がページの言語を示します) となります。この方法はVisual Studioやその他のIDEでは自動的に行われますが、ユーザーはコード ビハインド ページ名を変更できます。また、Web アプリケーション フォーマットでは、pagename.aspx.cs は pagename.designer.cs ファイルにリンクされた部分クラスです。デザイナーファイルは、ASPX ページから自動生成されるファイルで、プログラマーがコードビハインドページから ASPX ページのコンポーネントを参照できるようにします。これにより、バージョン 2 より前の ASP.NET バージョンで必要だったように、コンポーネントを手動で宣言する必要がなくなります。 [ 8 ]このスタイルのプログラミングを使用する場合、開発者はドキュメントの手順をたどるのではなく、ページの読み込みやコントロールのクリックなどのさまざまなイベントに応答するコードを記述します。
ASP.NETのコードビハインドモデルは、プレゼンテーションとコンテンツの分離を念頭に置いてアプリケーションを構築することを開発者に促す点で、従来のASPとは大きく異なります。理論的には、これによりWebデザイナーは、例えば、プログラミングコードに影響を与える可能性を減らしつつ、デザインマークアップに集中できるようになります。これは、モデル・ビュー・コントローラー(MVC)フレームワークにおけるコントローラーとビューの分離に似ています。
ディレクティブは、ASP.NET がページをどのように処理するかについての特別な指示です。[ 9 ]最も一般的なディレクティブは であり、ASP.NET ページ パーサーとコンパイラで使用される多くの属性を指定できます。<%@Page%>
ユーザーコントロールは、ページセクションの一部をカプセル化したもので、ASP.NETにおいてコントロールとして登録および使用されます。
プログラマーは、 ASP.NET アプリケーション用のカスタム コントロールを作成することもできます。ユーザー コントロールとは異なり、これらのコントロールには ASCX マークアップ ファイルがなく、すべてのコードがダイナミック リンク ライブラリ (DLL)ファイルにコンパイルされます。このようなカスタム コントロールは、複数の Web アプリケーションやVisual Studio 2013プロジェクトで使用できます。
.NET は「訪問済みコンポジット」レンダリング手法を使用します。コンパイル時に、テンプレート (.aspx) ファイルは初期化コードにコンパイルされ、元のテンプレートを表すコントロールツリー (コンポジット) が構築されます。リテラルテキストは Literal コントロールクラスのインスタンスに格納され、サーバーコントロールは特定のコントロールクラスのインスタンスで表されます。初期化コードは、ユーザーが記述したコード (通常は複数の部分クラスのアセンブリ) と組み合わされ、ページ固有のクラスが生成されます。ページはコントロールツリーのルートとしても機能します。
ページの実際のリクエストは、いくつかのステップを経て処理されます。まず、初期化ステップでページクラスのインスタンスが作成され、初期化コードが実行されます。これにより初期制御ツリーが生成され、通常は後続のステップでページのメソッドによって操作されます。ツリー内の各ノードはクラスのインスタンスとして表現される制御であるため、コードはツリー構造を変更したり、個々のノードのプロパティやメソッドを操作したりすることができます。最後に、レンダリングステップでは、ビジターを使用してツリー内のすべてのノードを訪問し、各ノードにビジターのメソッドを使用して自身をレンダリングするように要求します。結果として得られるHTML出力がクライアントに送信されます。
リクエストの処理が完了すると、ページクラスのインスタンスは破棄され、それに伴いコントロールツリー全体も破棄されます。これは、ページリクエスト/レスポンスサイクルごとに失われるクラスインスタンスメンバーに依存しているASP.NET初心者プログラマーにとって混乱の原因となります。
ASP.NET アプリケーションはWeb サーバーでホストされ、ステートレスなHTTPプロトコルを使用してアクセスされます。そのため、アプリケーションがステートフルなインタラクションを使用する場合は、状態管理を独自に実装する必要があります。ASP.NET は、状態管理のためのさまざまな機能を提供しています。概念的には、Microsoft は「状態」をGUI の状態として扱います。アプリケーションが「データ状態」を追跡する必要がある場合、問題が発生する可能性があります。たとえば、リクエスト間で一時的な状態になる可能性がある有限状態機械(遅延評価) や、初期化に時間がかかる場合などです。認証付きの ASP.NET ページにおける状態管理は、Web スクレイピングを困難または不可能にする可能性があります。
アプリケーションの状態は、共有ユーザー定義変数のコレクションによって保持されます。これらは、Application_OnStartアプリケーションの最初のインスタンスの読み込み時にイベントが発生すると設定および初期化され、最後のインスタンスが終了するまで利用可能です。アプリケーションの状態変数にはApplications、アプリケーションの状態をラップするコレクションを使用してアクセスします。アプリケーションの状態変数は名前で識別されます。[ 10 ]アプリケーションは状態管理です。
サーバー側のセッション状態は、ユーザーセッション中に保持されるユーザー定義のセッション変数のコレクションによって保持されます。このSessionコレクションを使用してアクセスされるこれらの変数は、各セッションインスタンスに固有です。セッションが終了していなくても、定義された非アクティブ時間が経過すると、変数が自動的に破棄されるように設定できます。クライアント側のユーザーセッションは、Cookieまたは URL 自体にセッション ID をエンコードすることによって維持されます。[ 10 ]
ASP.NET は、サーバー側のセッション変数の永続化に関して 3 つのモードをサポートしています。[ 10 ]
ASP.NET セッション状態を使用すると、Web アプリケーションでユーザーが ASP.NET ページをナビゲートする際に、ユーザーの値を保存および取得できます。HTTP はステートレス プロトコルです。つまり、Web サーバーはページへの各 HTTP リクエストを独立したリクエストとして扱います。サーバーは、以前のリクエストで使用された変数の値に関する情報を保持しません。ASP.NET セッション状態は、限られた時間内に同じブラウザーからリクエストされたリクエストをセッションとして識別し、そのセッションの期間中、変数の値を保持する方法を提供します。既定では、ASP.NET セッション状態はすべての ASP.NET アプリケーションで有効になっています。
セッション状態の代替案としては、以下のようなものがあります。
ビュー状態とは、ASP.NET アプリケーションが出力する HTML ページが Web フォーム コントロールとウィジェットの状態を維持するために使用する、ページ レベルの状態管理メカニズムを指します。コントロールの状態はエンコードされ、フォーム送信のたびに、 と呼ばれる非表示フィールドでサーバーに送信されます__VIEWSTATE。サーバーは変数 を返送し、ページが再レンダリングされたときにコントロールが最後の状態でレンダリングされるようにします。サーバー側では、処理でコントロールの状態変更が必要な場合、アプリケーションはビュー状態を変更できます。個々のコントロールの状態はサーバーでデコードされ、ViewStateコレクションを使用する ASP.NET ページで使用できるようになります。[ 11 ]
この機能の主な用途は、ポストバック間でフォーム情報を保持することです。ビュー状態はデフォルトで有効になっており、通常、ポストバック中に実際に使用されるかどうかに関わらず、ページ上のすべてのコントロールのデータをシリアル化します。ただし、ビュー状態はコントロールごと、ページごと、またはサーバー全体で無効にできるため、この動作は変更可能であり、変更すべきです。
開発者は、ページやコントロールのビュー状態に機密情報やプライベート情報を保存する際には注意が必要です。ビュー状態データを含むBase64文字列は簡単に逆シリアル化される可能性があるためです。デフォルトでは、ビュー状態は値を暗号化しません__VIEWSTATE。暗号化はサーバー全体(およびサーバー固有)で有効にすることができ、一定レベルのセキュリティを維持できます。[ 12 ]
ASP.NETには、アプリケーション全体で共有され、さまざまなオブジェクトを保存するために使用できる「Cache」オブジェクトが用意されています。「Cache」オブジェクトは、指定された期間のみデータを保持します。
ASP.NET が最初にリリースされたとき、テンプレート エンジンがありませんでした。.NET Framework はオブジェクト指向で継承が可能であるため、多くの開発者は「 」を継承する新しい基底クラスを定義し、そこに HTML をレンダリングするメソッドSystem.Web.UI.Pageを記述し、アプリケーションのページをこの新しいクラスから継承するようにしていました。これにより、サイト全体で共通の要素を再利用できますが、複雑さが増し、ソース コードとマークアップが混在します。さらに、この方法はアプリケーションを実行して視覚的にテストするしかなく、設計中はテストできません。他の開発者は、すべてのページで同じナビゲーションやその他の要素を実装する必要がないように、インクルード ファイルやその他のテクニックを使用していました。
ASP.NET 2.0 では、テンプレートベースのページ開発を可能にするマスター ページの概念が導入されました。Web アプリケーションには 1 つ以上のマスター ページがあり、ASP.NET 2.0 以降では、マスター ページをネストすることができます。[ 13 ]マスター テンプレートには、動的なコンテンツが配置される場所を示すContentPlaceHolderと呼ばれるプレース ホルダー コントロールと、子ページ間で共有されるHTMLおよびJavaScript があります。
子ページはContentPlaceHolderコントロールを使用します。このコントロールは、コンテンツページがコンテンツを生成するマスターページのプレースホルダーにマッピングする必要があります。ページの残りの部分は、マスターページの共有部分によって定義されます。これは、ワープロソフトの差し込み印刷に似ています。コンテンツページ内のすべてのマークアップとサーバーコントロールは、ContentPlaceHolderコントロール内に配置する必要があります。
コンテンツページへのリクエストがあると、ASP.NET はコンテンツページの出力とマスターページの出力をマージし、その出力をユーザーに送信します。
マスターページはコンテンツページから完全にアクセス可能です。つまり、コンテンツページはヘッダーの操作、タイトルの変更、キャッシュの設定などを行うことができます。マスターページがパブリックプロパティやメソッド(著作権表示の設定など)を公開している場合、コンテンツページはそれらも使用できます。
ASP.NETのさまざまなバージョンに関連付けられているその他のファイル拡張子には、次のものがあります。
一般的に、ASP.NET のディレクトリ構造は開発者の好みに応じて決定できます。予約済みのディレクトリ名がいくつかある場合を除き、サイトは任意の数のディレクトリにまたがることができます。構造は通常、URL に直接反映されます。ASP.NET は処理中の任意の時点でリクエストをインターセプトする手段を提供しますが、開発者はリクエストを中央アプリケーションやフロントコントローラ経由で処理する必要はありません。
特別なディレクトリ名(ASP.NET 2.0以降)は次のとおりです。[ 16 ]
ASP.NET は、 Web サーバー上でサーバー側コードが初めて使用されるときに 1 つ以上のDLLファイルにコンパイルすることで、他のスクリプトベースのテクノロジー (Classic ASP を含む) よりもパフォーマンス上の利点を得ることを目指しています。これらの DLL ファイルまたはアセンブリには、共通言語ランタイム内で実行するための Microsoft Intermediate Language (MSIL) が含まれています。これにより、純粋なスクリプト言語よりもパフォーマンスが向上し、Python で使用されているアプローチと似ており、JavaServer Pagesとそれほど違いはありません。[ 18 ]このコンパイルは、ページが最初に要求されたときに自動的に行われます (つまり、開発者はページごとに別のコンパイル手順を実行する必要はありません)。
この機能は、スクリプト言語による開発の容易さと、コンパイル済みバイナリによるパフォーマンス上の利点を両立させています。ただし、コンパイル処理によって、編集後のページがWebサーバーに初めてリクエストされた際に、ユーザーにわずかな遅延が発生する可能性がありますが、リクエストされたページがさらに更新されない限り、遅延は発生しません。
ASPX ファイルやその他のリソース ファイルは、インターネット インフォメーション サービスサーバー (またはその他の互換性のある ASP.NET サーバー。下記の「その他の実装」を参照) 上の仮想ホストに配置されます。クライアントが初めてページを要求すると、.NET Framework はファイルを解析して .NET アセンブリにコンパイルし、応答を送信します。以降の要求は DLL ファイルから処理されます。デフォルトでは、ASP.NET は最初の要求時にサイト全体を 1000 ファイルのバッチでコンパイルします。コンパイルの遅延が問題となる場合は、バッチ サイズまたはコンパイル戦略を調整できます。
開発者は、Microsoft Visual Studio を使用してデプロイ前に「コードビハインド」ファイルをプリコンパイルすることも選択でき、本番環境でのジャストインタイムコンパイルの必要性を排除できます。 [ 19 ]これにより、Web サーバーにソースコードを置く必要もなくなります。また、プリコンパイルされたテキストもサポートしています。
ASP.NET WebForms は、Windowsユーザー インターフェイスと同様のコントロールで構成されたページを作成できる機能を提供することで、開発者がWindowsアプリケーション開発から Web 開発へ移行するのを簡素化します。ボタンやラベルなどの Web コントロールは、Windows のコントロールとほぼ同じように機能します。コードを使用してプロパティを設定したり、イベントに応答したりできます。コントロールは自身をレンダリングする方法を知っています。Windows コントロールは画面に自身を描画しますが、Web コントロールは、エンド ユーザーのブラウザーに送信される結果ページの構成要素となるHTMLとJavaScriptのセグメントを生成します。
ASP.NET WebFormsは、プログラマーに対し、ASPやPHPといった従来のWebスクリプト環境ではなく、イベント駆動型のGUIモデルを用いたアプリケーション開発を推奨しています。このフレームワークは、JavaScriptなどの既存技術と「 ViewState 」などの内部コンポーネントを組み合わせることで、本来ステートレスなWeb環境に永続的な(リクエスト間の)状態をもたらします。
クラシックASPとのその他の相違点は以下のとおりです。
<%@ Page Language = "C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat= "server" > protected void Page_Load ( object sender , EventArgs e ) { Label1 . Text = DateTime . Now . ToLongDateString (); } </script> < html xmlns= "http://www.w3.org/1999/xhtml" > <head runat= "server" > <title>サンプルページ</title> </head> <body> <form id= "form1" runat= "server" > <div>現在の時刻は: <asp:Label runat= "server" id= "Label1" /> </div> </form> </body> </html>