200810032. Webアプリケーションの特徴
「ブラウザ」と「サーバ」間でのやりとりを繰り返すことで
一連の処理を行う
ブラウザ
サーバにリクエストをあげる(リクエストの実態は文字列)
サーバから受け取ったHTML(JavaScriptを含む)を解釈してユー
ザインタフェースを表示する
サーバ
ブラウザから受け取ったリクエストに応じた処理を行い、HTMLを
組み立ててブラウザに返す
HTMLというソースコードを生成しているといえる
文字列(リクエスト)を受け取って文字列(HTML)を返す
サーバの処理の本質は文字列操作といえる
複数のブラウザからのリクエストを同時に処理する
サーバへのリクエストがあって、はじめてレスポンスが返る
サーバから一方的にデータを送りつけることはできない
サーバはステート(前回のリクエスト状態等)を持たない
ブラウザから次のリクエストが送られることを予期しない
3. ASP.NETの特徴
PostBackが基本
formタグのaction先が自分自身
ASP等ではaction先を別のページにし、データ入力ペー
ジとデータ処理ページを分けるのが一般的だった
イベントドリブン型の開発のための仕掛け
コンパイルによる処理速度向上
aspxファイルはソースコード化されコンパイル
最初の実行開始時にdllが作成される
ソースの修正等をしなければdllはそのまま利用される
実行時にメソッド単位でJITコンパイルされるのは
Windowsアプリ等と同じ
4. ASP.NETの実行環境
IIS6まで
IISのインストール後、.NET Frameworkをイン
ストールする
逆になってしまった場合はaspnet_regiis.exeを
利用して修復可能
.NET Framework 2.0 以降をインストールする
と、IISの管理ツールに.NET Frameworkのバー
ジョン管理が追加される
Ver 1.1までの場合はaspnet_regiisにて管理
Ver 3.0、3.5での実行はVer2.0を指定する
5. IIS6上のWebアプリケーション
フォルダをアプリケーションとして「設定」する
仮想ディレクトリでも実フォルダでも可能
標準で仮想ディレクトリを追加すると、アプリケーショ
ンとして設定済みとなる
仮想ディレクトリはアプリケーションとして設定せず、
単に実ディレクトリ構成とは異なるフォルダ階層を実現
するためにも利用可能
アプリケーションの設定とは
Windowsアプリケーションの1つのexeファイルと個々の
アプリケーション設定が対応するイメージ
アプリケーションの境界
Frameworkのバージョン
セキュリティ/アクセス制御
6. IIS6の認証とASP.NETの認証
IIS側でも認証設定が可能
匿名
基本認証
統合 Windows 認証
ASP.NETにも認証機能がある
Form認証
DBベース
Active Directoryベース
Form認証を簡単に利用できるコントロール群を提供
Windwos認証
ASP.NETの認証機能を利用するほうが細かい設定が容易
IIS側は匿名を許可しておく
7. 開発サーバとIISの違い
VS2005以降には開発サーバが含まれており、その上で
動作検証が可能
開発サーバとIISでは動作が異なる
ファイルマッピング
開発サーバ - すべてのファイルがASP.NETによって処理され
る
IIS - アプリケーションの構成でASP.NETに関連づけられた拡
張子のファイルのみASP.NETによって処理される
開発サーバではweb.configによるアクセス制御が画像ファイ
ル等にも影響する
実行ユーザ
開発サーバ - ログイン中のユーザの権限で実行される
IIS - ASPNETユーザまたはNetwork Serviceユーザの権限で実
行される
ファイルへの書き込み等を行っている場合に注意
9. ASP.NETの設定
マシン全体の設定
C:WindowsMicrosoft.NETFrameworkv2.0.50727CONFIG
machine.config
web.config
デフォルトの設定についてはconfigに記述されていないものも
初期起動時の速度を早くするため、ハードコーディングされている
ドキュメントにて確認できるものもある
アプリケーション単位の設定
アプリケーションとして設定されているフォルダに存在する
web.config
設定の種類によってはこの場所に記述しないと有効にならないもの
がある
マシン全体の設定を引き継ぐ
下層のフォルダ単位の設定
各フォルダに存在するweb.config
アプリケーション単位のweb.config内に含めることも可能
上位フォルダの設定を引き継ぐ
10. ASP.NET 2.0と3.5
web.configの違いでしかない
VS2008で対象となるFrameworkを変更すると、
web.configが書き換わる
.NET Framework 2.0、3.0、3.5はすべて2.0のCLRを
利用する
ASP.NET では、3.0は2.0から何も変化がなかったため
通常利用しない
Ver 3.5では言語のコンパイラが新しくなり、いく
かのdllが追加された
web.configに追加されたdllの参照と利用するコンパイ
ラの設定が追加される
13. HttpContext
リクエストがあがってきてレスポンスを返すまで生存している
グローバル変数のような意味を持つインスタンスとなっている
以下のようなデータを格納
リクエストの内容
レスポンスの内容
アプリケーションオブジェクト
セッションオブジェクト
キャッシュデータ
ユーザ情報
httpコンテキストの内容を書き換えることでASP.NETの動作を変え
ることが可能
例:URLリライト
Context.Rewritepath
現在のコンテキストはHttpContext.Currentで取得
Pageの中ではContextプロパティで取得可能
独自クラスの中でHttpContext.Currentを利用
14. アプリケーションイベント
アプリケーションイベントの発生順序は固定
HttpApplicationクラスのドキュメントで確認
BeginRequest リクエストの処理開始時に発生
AuthenticateRequest 認証の開始時に発生
PostAuthenticateRequest 認証の終了時に発生
AuthorizeRequest 承認の開始時に発生
PostAuthorizeRequest 承認の終了時に発生
ResolveRequestCache キャッシュの処理の開始時に発生
PostResolveRequestCache キャッシュの処理の終了時に発生
PostMapRequestHandler ハンドラの生成後に発生
AcquireRequestState セッション等の状態の取得時に発生
PostAcquireRequestState セッション等の状態の取得後に発生
PreRequestHandlerExecute ハンドラの実行前に発生
PostRequestHandlerExecute ハンドラの実行後に発生
ReleaseRequestState セッション等の状態の開放時に発生
PostReleaseRequestState セッション等の状態の開放後に発生
UpdateRequestCache キャッシュの状態更新時に発生
PostUpdateRequestCache キャッシュの状態更新後に発生
EndRequest リクエストの処理終了時に発生
Global.asax内で個々のイベントにたいする処理を記述可能
15. HttpModule
アプリケーションイベントをトリガにし
て実行する処理をまとめて登録するしく
み
IHttpModuleインタフェースを継承したク
ラスで最低限InitメソッドとDisposeメソッ
ドを実装する
Initメソッド-アプリケーションイベントにプ
ライベートメソッドを登録する
Disposeメソッド-通常は空でよい
作成したクラスをweb.configで登録する
16. 実装済のHttpModule
マシンレベルのweb.configで登録
System.Web.Caching.OutputCacheModule
System.Web.SessionState.SessionStateModule
System.Web.Security.WindowsAuthenticationModule
System.Web.Security.FormsAuthenticationModule
System.Web.Security.PassportAuthenticationModule
System.Web.Security.RoleManagerModule
System.Web.Security.UrlAuthorizationModule
System.Web.Security.FileAuthorizationModule
System.Web.Security.AnonymousIdentificationModule
System.Web.Profile.ProfileModule
System.Web.Mobile.ErrorHandlerModule
System.ServiceModel.Activation.HttpModule
ASP.NETの基本的な動作はHttpModuleで実装されている
IIS7のモジュールとしてHttpModuleを利用可
18. HttpHandlerの設定
マシンレベルのweb.config
<httpHandlers>
…
<add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory"
validate="True"/>
<add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory"
validate="True"/>
<add path="*.asmx" verb="*"
type="System.Web.Services.Protocols.WebServiceHandlerFactory,
System.Web.Services, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" validate="False"/>
…
<add path="*.cs" verb="*" type="System.Web.HttpForbiddenHandler"
validate="True"/>
…
</httpHandlers>
拡張子をどのクラスが処理するかを設定
IISからASP.NETに制御が渡されていることが前提
19. aspxファイル
System.Web.UI.Pageクラスを継承
IHttpHandlerインターフェイスを継承している
内部に多くのコントロールを持つ
通常ツールボックスからのドラッグ アンド ドロップで追加
ページライフサイクル
ページのインスタンスはリクエスト毎に生成され消滅する
初期表示時のインスタンスとポストバック時のインスタンス
に関連は存在しない(ステートレス)
ページが生成して消滅するまでにページイベントが決まっ
た順番で発生する
20. 動作サンプル
Default.aspx
Trace=“true”をPageディレクティブに記述
テキストボックス、ボタン、ラベルを追加
Default.aspx.cs
protected void Button1_Click(object sender, EventArgs e)
{
Trace.Warn("ボタンクリック時の処理");
Label1.Text = TextBox1.Text;
}
21. コントロールのツリー
_Page
LiteralControl - DOCTYPE、HTMLタグ
HtmlHead - headタグ
HtmlTitle - titleタグ
LiteralControl - bodyタグ
HtmlForm - formタグ
LiteralControl - divタグ
TextBox - テキストボックス
LiteralControl - 改行コード(CRLF)
Button - ボタン
LiteralControl - 改行コード + brタグ
Label - ラベル
LiteralControl - 改行コード + div終了タグ
LiteralContorl - body、html終了タグ
ソースコードで対応を確認
23. コントロールの種類
HTMLコントロール
HTMLツールボックスからドラッグ アンド ドロップ
コントロールツリーではLiteralControlとなり、サーバ上のプログラムで
制御できない
記述した内容そのままがHTMLとなる
HTMLサーバコントロール
HTMLコントロールにrunat=“server”を追加
サーバ上のプログラムで制御可能
記述した内容がほぼそのままHTMLとなる
Webコントロール
標準ツールボックスからドラッグ アンド ドロップ
サーバ上のプログラムで制御可能
プロパティの状態によって生成されるHTMLが変わる
TextBoxのTextMode(SingleLine、Password、MultiLine)
ViewStateを利用し、ポストバック前後の自分の状態を保持する
ViewStateとポストデータを比較し、イベントを発生させる
カレンダー、データグリッドのように内部的にコントロールを持つ複合
コントロールも存在する
24. ページイベント
初期表示時 ポストバック時
Begin PreInit Begin PreInit
End PreInit End PreInit
Begin Init Begin Init
End Init End Init
Begin InitComplete Begin InitComplete
End InitComplete End InitComplete
Begin LoadState
End LoadState
Begin ProcessPostData
End ProcessPostData
Begin PreLoad Begin PreLoad
End PreLoad End PreLoad
Begin Load Begin Load
End Load End Load
Begin ProcessPostData Second Try
End ProcessPostData Second Try
Begin Raise ChangedEvents
End Raise ChangedEvents
Begin Raise PostBackEvent
End Raise PostBackEvent
Begin LoadComplete Begin LoadComplete
End LoadComplete End LoadComplete
Begin PreRender Begin PreRender
End PreRender End PreRender
Begin PreRenderComplete Begin PreRenderComplete
End PreRenderComplete End PreRenderComplete
Begin SaveState Begin SaveState
End SaveState End SaveState
Begin SaveStateComplete Begin SaveStateComplete
End SaveStateComplete End SaveStateComplete
Begin Render Begin Render
End Render End Render
25. ページイベントによる処理
初期化
コントロールツリーの作成
リクエスト読み込み
ポストバック時のみ
ビューステート、ポストデータを各コントロールに割り当て
コントロールイベント
ポストバック時のみ
ビューステートとポストデータの違いからコントロールイベント
が発生
ポストバックイベント
ポストバック時のみ
ポストバックの原因となったイベントが発生
レンダリング
各コントロールがプロパティの状態を元に自分自身をHTML化し、
レスポンスに追加
30. リダイレクト
サーバの処理中にリダイレクトを記述する
Response.Redirect(”遷移先URL”);
実際にはブラウザに対して指定したURLにGET
メソッドを発行するよう指示するレスポンスが
送られる
ブラウザとのやりとりが発生する
リンク先やリンク元が異なるWebアプリケーション
でも遷移が可能
ASP.NETのサイトに限らない
GETメソッドを利用した遷移
クエリ文字列を利用したデータの引渡しは可能
URLの長さには制限あり
31. トランスファー
サーバの処理中にトランスファーを記述する
Server.Transfer(“遷移先URL”);
実際には指定したページのインスタンスが生成され、
そのページの処理が開始される
トランスファーの遷移先は同一のWebアプリケーション
内に限定される
1つのリクエストの処理の中で実行されるページのイ
ンスタンスが置き換わるため、ブラウザのURLは遷移前
のまま変わらない
1つのリクエストの処理の中で実行されるページが置き
換わるため、ページの認証、承認といったアプリケー
ションイベントは遷移前のページに対して行われ、遷
移後のページに対しては実行されない
一般的には使わない
33. 別ページポストバック
ボタン、リンクボタン、イメージボタンの
PostBackUrlオプションに遷移先を設定する
ボタンクリックにより指定した遷移先が呼び
出される
POSTメソッドを利用した呼び出しが行われる
JavaScriptを利用してformのポスト先を書き換えて
いる
遷移した先が同一Webアプリケーションであれば
PreviousPageTypeディレクティブを設定して遷移元
で公開しているプロパティの値を取得可能
34. ステート保持
Webアプリケーションの基本はステートレス
ページの遷移時だけでなく、ポストバック時も以
前の状態を保持できない
アプリケーションとして一連の処理を実行す
るためには様々な長さでステートを保持でき
る必要がある
ポストバック間
ページ遷移間
ユーザが処理を行っている間
アプリケーションが起動している間
35. ポストバック間でのステート保持
ViewState
WebコントロールはデフォルトでViewStateを利用
する
ページ単位、コントロール単位で制御可能
プログラムから独自に利用することも可能
格納できるのはシリアライズ可能なオブジェクト
取得時に型を設定する必要がある
データ量に注意する必要がある
DataGrid等とSqlDataSourceを組み合わせてページン
グ/ソーティングを行っている場合、表示される
データは該当するページ内のものだが、ViewStateに
は抽出されたすべてのデータが含まれる
通信量の増大が体感実行速度に影響
36. ページ遷移間でのステート保持
ページ遷移の方法によって利用できるものが異
なる
リンク:クエリ文字列
リダイレクト:クエリ文字列
トランスファー:クエリ文字列、HttpContext.Items
ページ間ポストバック:POSTデータ、ViewState
HttpContext.Items
IDictionary型-keyを設定してobjectを格納できる
HttpContextはリクエストの処理の間を通じて存在して
おり、トランスファー実行時のページ間でのデータの
受け渡しが可能
37. ユーザが処理を行っている間の
ステート保持
クッキー
ブラウザ側で値を保持
リクエスト時に毎回ブラウザからサーバに送られる
有効期間を設定可能
ブラウザを閉じても存続させることが可能
格納できる長さに制限あり
ブラウザの設定によっては利用不可
セッションオブジェクト
デフォルトではセッションの判定(セッションキーを保持している)にクッ
キーを利用
デフォルトではサーバ上のメモリにデータを格納する
格納できるデータはシリアライズ可能なもの
セッションキーを保持しているブラウザから一定期間アクセスがない場合に
データは破棄される
httpはブラウザからのリクエストではじめて処理が開始されるので、サーバ側
ではリクエストを待っているしかない
Web.configで一定期間の設定を変更可能
38. セッション利用の設定変更
クッキーレス
<system.web>
<sessionState cookieless="UseUri"/>
</system.web>
携帯等クッキーを利用できないブラウザを想定する場合に設定
セッションキーがURLに埋め込まれる
データの保存場所
<system.web>
<sessionState mode=“InProc"/>
</system.web>
InProc
サーバ上のメモリ内に格納される
Session_OnEndが発生するのはこの状態のみ
StateServer
複数台のサーバがある場合、その中の一台のメモリ上に格納される
セッションを格納するサーバでStateServerのサービスを起動する必要がある
SQLServer
データベース上に格納される
aspnet_regsql.exeツールを利用してセッション状態を保持するデータベースをインストールする
セッションデータはアクセスがない状態で一定時間が経過したタイミングで削除される
39. アプリケーションが起動している間の
ステート保持
アプリケーションオブジェクト
格納できるデータはシリアライズ可能なもの
書き込み時には競合に注意
Application.Lock()、Application.UnLock()を利用する
Lock、UnLockはファイル書き込み等の排他制御に利用す
ることも可能
処理速度を低下させる場合もあるので利用には注意
Webアプリケーションは一定時間リクエストをまった
く受け取らなかった場合に終了することに注意
httpはブラウザからのリクエストではじめて処理が開始さ
れるので、サーバ側ではリクエストを待っているしかな
い
Web.configで一定期間の設定を変更可能
次にリクエストを受け取ったときに起動が行われる
40. まとめ
ASP.NETは柔軟な拡張性を持ったフレーム
ワーク
HttpContext、HttpModule、HttpHandlerが理解でき
れば独自の拡張を施すことも可能
Dynamic Data、ASP.NET MVC等がよい例
Webアプリケーションの本質は文字列操作で
ある
ASP.NETはコントロール(クラス)を利用し、イ
ベントドリブンでの開発を可能にしている
ASP.NETの仕組みが理解できていれば、生の文字
列操作レベルの細かい制御を組み込むことも可能