200903281. ASP.NET に入門する 2 日間
Visual Studio User Group
Web アプリケーションフォーラムリーダー
小野 修司 (どっとねっと
ふぁん)
2009/3/28 - 29
7. http 基礎
サーバへのリクエストがあって、はじめてレスポン
スが返る
• サーバから一方的にデータを送りつけることはできない
サーバはステート(前回のリクエスト状態等)を持
たない
• ブラウザから次のリクエストが送られることを予期しない
利用されるメソッド
• GET
• ブラウザに URL を入力し、リターンキーを押したとき
• 指定した URL に相当するページを返すようサーバに指示
• クエリ文字列を利用することで引数的にデータを渡せる
• 文字数制限あり( IE 2,083 文字)
• POST
• 入力欄にデータを入力し、ボタン等を押したとき
• 入力されたデータ等をサーバに渡す
• 送信先ページは action で指定
• 文字数制限なし
8. http の動作を確認する
telnet による動作確認
telnet > open localhost ポート番号
GET / プロジェクト名 / Index.htm HTTP / 1.1
Host: localhost
• HTML が返される
http による通信は文字列のやりとりである
• ブラウザとサーバで共通のデータを扱うためにはデータを文字列化して
リクエスト/レスポンスに含める必要がある
http による通信は必ずリクエストからはじまる
ブラウザは HTML を解釈して画面表示を行う
• サーバは HTML というソースコードを生成する
• サーバ上でできる処理(ソースコード生成-文字列組み立て)とブラウザで
できる処理(画面表示変更)を区別した設計が必要
ASP.NET も http の上になりたっている
10. ASP.NET の特徴
PostBack が動作の基本
• form タグの action 先が自分自身
• ASP 等では action 先を別のページにし、データ入力ペ
ージとデータ処理ページを分けるのが一般的だった
• イベントドリブン型の開発のための仕掛け
コンパイルによる処理速度向上
• aspx ファイルはソースコード化されコンパイル
• 最初の実行開始時に dll が作成される
• ソースの修正等をしなければ dll はそのまま利用される
• 実行時にメソッド単位で JIT コンパイルされるの
は Windows アプリ等と同じ
11. ASP.NET の動作を確認する
サンプルプログラム
• Default.aspx
• Page ディレクティブに Trace = “true” を追加
• テキストボックス、ボタン、ラベルを追加
• Default.aspx.cs
protected void Button1_Click(object sender,
EventArgs e)
{
Label1.Text = TextBox1.Text;
}
12. 確認してみる内容
初期表示時の要求の種類の確認
• トレースで表示される
ソース/ HTML の確認
• プラウザからソースを表示
• form タグに注目
ボタンクリック後の要求の種類の確認
• トレースで表示される
テンポラリーファイルの内容を確認
• VISTA VS2008
• C:UsersUserNameAppDataLocalTempTemporary ASP.NET Files
• VS2005 まで
• C:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET
Files
• d ll、ソースコード( debug 時)、その他
14. 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 を指定する
15. IIS6 上の Web アプリケーシ
ョン
フォルダをアプリケーションとして「設定」する
• 仮想ディレクトリでも実フォルダでも可能
• 標準で仮想ディレクトリを追加すると、アプリケーシ
ョン
として設定済みとなる
• 仮想ディレクトリはアプリケーションとして設定せず
、
単に実ディレクトリ構成とは異なるフォルダ階層を実
現するためにも利用可能
アプリケーションの設定とは
• Windows アプリケーションの 1 つの exe ファイル
と
個々のアプリケーション設定が対応するイメージ
• アプリケーションの境界
• Framework のバージョン
• セキュリティ/アクセス制御
16. IIS6 の認証と ASP.NET の認証
IIS 側でも認証設定が可能
• 匿名
• 基本認証
• 統合 Windows 認証
ASP.NET にも認証機能がある
• Form 認証
• DB ベース
• Active Directory ベース
• Windows 認証
ASP.NET の認証機能を利用するほうが
細かい設定が容易
• IIS 側は匿名を許可しておく
17. 開発サーバと IIS の違い
VS2005 以降には開発サーバが含まれており、
その上で動作検証が可能
開発サーバと IIS では動作が異なる
• ファイルマッピング
• 開発サーバ - すべてのファイルが ASP.NET によって処理さ
れる
• IIS - アプリケーションの構成で ASP.NET に関連づけられ
た
拡張子のファイルのみ ASP.NET によって処理される
• 開発サーバでは web.config によるアクセス制御が
画像ファイル等にも影響する
• 実行ユーザ
• 開発サーバ - ログイン中のユーザの権限で実行される
• IIS - ASPNET ユーザまたは Network Service ユーザの
権限で実行される
• ファイルへの書き込み等を行っている場合に注意
18. IIS7 と ASP.NET
ASP.NET を有効にすることで実行可能
IIS7 は ASP.NET をベースに進化したものと
考えてよい(統合モード)
• ファイルはすべて ASP.NET によって処理される
• 実行ユーザは NT AUTHORITYNETWORK SERVICE
• ASP.NET の設定と IIS7 の設定ツールが一体化してい
る
• 一部 web.config の書き方が異なるので注意
IIS6 と同様の動作をさせるためには
クラッシックモードを選択
アプリケーションの設定は IIS7 でも必要
20. Visual Studio と .NET
Framework
Visual Studio .NET
• .NET Framework 1.0
• Web アプリケーションプロジェクト
Visual Studio .NET 2003
• .NET Framework 1.1
• Web アプリケーションプロジェクト
Visual Studio 2005
• .NET Framework 2.0
• Web サイトプロジェクト
Visual Studio 2005 SP1
• .NET Framework 2.0
• Web サイトプロジェクト/ Web アプリケーションプロジェクト
Visual Studio 2008
• .NET Framework 2.0
• .NET Framework 3.0
• .NET Framework 3.5
• Web サイトプロジェクト/ Web アプリケーションプロジェクト
21. 無料で利用できる開発環境
Visual Web Developer 2008 Express Edition
with SP1
• http://www.microsoft.com/japan/msdn/vstudio/express/
• 商用利用可
• 開発用サーバが含まれ、 IIS がなくても開発可能
• .NET Framework 3.5 SP1 に対応
• Web サイトプロジェクト、 Web アプリケーショ
ン
プロジェクトの両方に対応( 2008 SP1 から)
• 機能的な制限は他の手段でなんらかの対応が可能
• 別マシン上のデータベースサーバに接続不可
• .NET Framework 2.0/3.0 を対象としたプロジェクト構成
なし
• テストプロジェクトの利用不可
• Visual Souce Safe への連携なし
23. 何が違うのか?
コンパイルのタイミング
• Web アプリケーションプロジェクト
• コードビハインドファイル、クラスファイル等のコードファイルをあらかじ
め
コンパイルし、その dll ファイルを bin フォルダに配置する必要がある
(デバッグ時のビルド)
• aspx ファイルのみ実行時にコンパイルされる
• Web サイトプロジェクト
• すべてのファイルは実行時に一緒にコンパイルされる
• デバッグ時のビルドではコンパイルエラーのチェックのみ行われる
ファイル/フォルダ構成
• Web アプリケーションプロジェクト
• すべてのファイルを表示ボタンがある
• bin フォルダは通常非表示
• 特定のフォルダ構成を必要としない
• Web サイトプロジェクト
• クラスファイルは App_Code フォルダに配置
• 別に dll 化されたファイルを利用しない場合は bin フォルダは必要ない
24. こんな部分も違う
言語の混在
• Web アプリケーションプロジェクト
• 不可
• Web サイトプロジェクト
• 可
• クラスファイルについてはフォルダを分け、 web.config の
compilation / codeSubDirectories セクションにフォルダ名を追加する
クラスのインテリセンス追加のタイミング
• Web アプリケーションプロジェクト
• ビルド後
• Web サイトプロジェクト
• ファイル保存後
階層型マスターページ
• Web アプリケーションプロジェクト
• トップのマスターページ、階層下のマスターページ、コンテンツ用のページの
テンプレートがそれぞれ分かれている
• Web サイトプロジェクト
• マスターページや Web ページを追加するときに上位のマスターページを指定す
る
25. Web サイトプロジェクトにのみ必要
な機能
プリコンパイル
• aspnet_compiler.exe を利用して明示的に実行
• Web サイトの発行によって自動的に実行
• aspx ファイルを含め、すべてのファイルを dll
化
• aspx ファイルは中身のないファイルに
• IIS の設定によってはファイルの存在が確認されるため
• プリコンパイル時の設定で aspx ファイルを残すこと
も可能
• dll は bin フォルダに格納
• 初期起動時のコンパイルが行われないため、
起動が多少はやい
• 配置先でソースの修正は不可に
• ソースの内容を見られることもない
27. ASP.NET の設定
マシン全体の設定
• C:WindowsMicrosoft.NETFrameworkv2.0.50727CONFIG
• machine.config
• web.config
• デフォルトの設定については config に記述されていないものもある
• 初期起動時の速度を早くするため、ハードコーディングされている
• ドキュメントにて確認できるものもある
アプリケーション単位の設定
• アプリケーションとして設定されているフォルダ(ルートフォルダ)に存在
する web.config
• 設定の種類によってはルートフォルダに記述しないと有効にならないものが
ある
• マシン全体の設定を引き継ぐ
下層のフォルダ単位の設定
• 各フォルダに存在する web.config
• アプリケーション単位の web.config 内に含めることも可能
• 上位フォルダの設定を引き継ぐ
28. 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 の参照と利用するコンパイ
ラの設定が追加される
• 3.5 SP1 は dll の追加と考えてよい
31. 概要
ブラウザからリクエストがあがる
http コンテキストが作られる
アプリケーションイベントが発生する
• アプリケーションイベントの発生順序は固定
• ページの処理が行われる
• ページイベントが発生する
• ページイベントの発生順序は固定
• ポストバック時はコントロールイベント、ポストバック
イベントが発生する
レスポンスが返される
• ページ、 http コンテキストのインスタンスは破棄
32. HttpContext
リクエストがあがってきてレスポンスを返すまで生存して
いる
• グローバル変数のような意味を持つインスタンスとなっている
以下のようなデータを格納
• リクエストの内容
• レスポンスの内容
• アプリケーションオブジェクト
• セッションオブジェクト
• キャッシュデータ
• ユーザ情報
http コンテキストの内容を書き換えることで ASP.NET
の
動作を変えることが可能
• 例: URL リライト
• Context.Rewritepath
現在のコンテキストは HttpContext.Current で取得
• Page の中では Context プロパティで取得可能
• 独自クラスの中で HttpContext.Current を利用
33. アプリケーションイベントの種
類
HttpApplication クラスのドキュメントで確認
BeginRequest リクエストの処理開始時に発生
AuthenticateRequest 認証の開始時に発生
PostAuthenticateRequest 認証の終了時に発生
AuthorizeRequest 承認の開始時に発生
PostAuthorizeRequest 承認の終了時に発生
ResolveRequestCache キャッシュの処理の開始時に発生
PostResolveRequestCache キャッシュの処理の終了時に発生
PostMapRequestHandler ハンドラの生成後に発生
AcquireRequestState セッション等の状態の取得時に発生
PostAcquireRequestState セッション等の状態の取得後に発生
PreRequestHandlerExecute ハンドラの実行前に発生
PostRequestHandlerExecute ハンドラの実行後に発生
ReleaseRequestState セッション等の状態の開放時に発生
PostReleaseRequestState セッション等の状態の開放後に発生
UpdateRequestCache キャッシュの状態更新時に発生
PostUpdateRequestCache キャッシュの状態更新後に発生
EndRequest リクエストの処理終了時に発生
34. アプリケーションイベント
イベントの発生順序は固定
• 必ず同じ順序で発生する
すべてのリクエストに対してイベントが発生
• 認証/承認等の処理はすべてのリクエストに対して
行われる
Global.asax に記述することでイベント発生時に
独自の処理を組み込める
• いくつかの処理を組み合わせて登録する HttpModule
という仕組みも存在する
• 認証/承認等の処理はデフォルトで組み込まれている
HttpModule により行われている
35. 重要なアプリケーションイベン
ト
認証
• 接続しているユーザがだれかを設定する
承認
• 接続しているユーザにページへのアクセス権が
あるかを確認する
ハンドラの実行
• aspx ページの実行
• ashx 、 asmx 、 svc 等もこの仕組みにより実行
36. アプリケーションイベントと
HttpContext
イベントにブレークポイントを設定
• BeginRequest
• AuthenticateRequest
• PostMapRequestHandler
ウォッチウィンドウで HttpContext.Current
の
以下のプロパティの状態を確認
• User
• Handler
アプリケーションイベントを通り抜けてい
くことで HttpContext が変化する
39. 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 に制御が渡されていることが前提
• この設定により、各種ページが呼び出される
• 存在しているファイルを呼び出さない設定も可能( HttpForbiddenHandler )
40. ashx ファイル
もっともシンプルな IHttpHandler 実装
• IsReusable メソッド
• false を返す
• ProcessRequest
• 処理を記述
• Context.Response にブラウザに返したいデータを書き込む
画像ファイルや文書ファイルのダウンロード時に
ASP.NET の処理を追加したい場合等に利用できる
• ダウンロード回数のカウント
• 認証済みユーザにのみダウンロードを許可
出力する内容を完全にコントロールできる
• aspx ファイルを利用すると、意図しない出力が追加される場合も
41. aspx ファイル
System.Web.UI.Page クラスを継承
• IHttpHandler インターフェイスを継承している
内部に多くのコントロールを持つ
• 通常ツールボックスからのドラッグ アンド ドロップで
追加
ページライフサイクル
• ページのインスタンスはリクエスト毎に生成され消滅
する
• 初期表示時のインスタンスとポストバック時のインスタンス
に
関連は存在しない(ステートレス)
• ページが生成して消滅するまでにページイベントが
決まった順番で発生する
42. ページイベント
初期表示時 ポストバック時
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
43. AutoEventWireup
ページイベントに対する処理を簡単に記述するための仕組み
ASP.NET 2.0 以降はデフォルトで true
• Page ディレクティブに記述されている
下記のメソッド呼び出しがハードコーディングされており、
該当するメソッドを作成しておけば自動的に呼び出される
Page_PreInit Page_Init
Page_InitComplete Page_Load
Page_PreLoad Page_LoadComplete
Page_PreRenderComplete Page_DataBind
Page_PreRender Page_SaveStateComplete
Page_Unload Page_Error
Page_AbortTransaction OnTransactionAbort
Page_CommitTransaction OnTransactionCommit
これ以外のイベント発生時のメソッド呼び出しは
初期化時に登録を行う必要がある
44. ページイベントによる処理(初期表示
)
Get メソッドによるアクセス
初期化
内部のコントロールを含む
コントロールツリーの作成
レンダリング
• 各コントロールがプロパティの状態を元に
自分自身を HTML 化し、レスポンスに追加
( HttpContext のレスポンスに書き込み)
45. コントロールのツリー
_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 終了タグ
ソースコードで対応を確認
46. コントロールツリー
aspx 内のすべての要素がコントロール
化
され Page クラスを根とするツリー構造
内で管理される
• 文字列 → LiteralControl
• ツリーの階層構造 = タグの階層構造
47. ページイベントによる処理(ポストバ
ック)
Post メソッドによるアクセス
初期化
内部のコントロールを含むコントロールツリーの作成
リクエスト読み込み
• ビューステート、ポストデータを各コントロールに割り当て
コントロールイベント
• ビューステートとポストデータの違いからコントロールイベン
トが発生
ポストバックイベント
• ポストバックの原因となったイベント(ボタンクリック等)が
発生
レンダリング
• 各コントロールがプロパティの状態を元に自分自身を HTML
化し、レスポンスに追加
50. ページ遷移の位置づけ
ASP.NET の基本は PostBack である
• 一連の処理は 1 ページ内で完結させるほうが
実装が楽
• 入力 → 入力確認表示 → 登録/登録確認表示
• ページの遷移は別の処理への移動ととらえる
利用できるページ遷移の種類
• リンク
• リダイレクト
• トランスファー
• 別ページポストバック
51. リンク
ユーザのクリックにより指定先の URL
を表示
• リンク先が異なる Web アプリケーションでも
遷移が可能
• ASP.NET のサイトに限らない
• GET メソッドを利用した遷移
• クエリ文字列を利用したデータの引渡しは可能
• URL の長さに制限あり
52. リダイレクト
サーバの処理中にリダイレクトを記述する
• Response.Redirect(“ 遷移先 URL ")
• 実際にはブラウザに対して指定した URLに
GET メソッドを発行するよう指示するレスポン
スが送られる
• ブラウザとのやりとりが発生する
• リンク先が異なる Web アプリケーションでも
遷移が可能
• ASP.NET のサイトに限らない
• GET メソッドを利用した遷移
• クエリ文字列を利用したデータの引渡しは可能
• URL の長さに制限あり
53. トランスファー
サーバの処理中にトランスファーを記述する
• Server.Transfer(“ 遷移先 URL ")
• 実際には指定したページのインスタンスが生成され、そのページの
処理が開始される
• トランスファーの遷移先は同一の Web アプリケーション内に限定
される
• 1 つのリクエストの処理の中で実行されるページのインスタンス
が
置き換わるため、ブラウザの URL は遷移前のまま変わらない
• 1 つのリクエストの処理の中で実行されるページが置き換わるため
、
ページの認証、承認といったアプリケーションイベントは、遷移前
55. 別ページポストバック
ボタン、リンクボタン、イメージボタンの
PostBackUrl オプションに遷移先を設定す
る
ボタンクリックにより指定した遷移先が
呼び出される
• POST メソッドを利用した呼び出しが行われる
• JavaScript を利用して form のポスト先を
書き換えている
• 遷移した先が同一 Web アプリケーションであれ
ば PreviousPageType ディレクティブを設定して
遷移元で公開しているプロパティの値を取得可能
57. ステート保持
Web アプリケーションの基本はステート
レス
• ページの遷移時だけでなく、ポストバック時
も
以前の状態を保持できない
アプリケーションとして一連の処理を
実行するためには、様々な長さでステー
トを
保持できる必要がある
• ポストバック間
• ページ遷移間
• ユーザが処理を行っている間
58. ポストバック間でのステート保
持
ViewState
• Webコントロールはデフォルトで ViewState を
利用する
• ページ単位、コントロール単位で制御可能
• プログラムから独自に利用することも可能
• 格納できるのはシリアライズ可能なオブジェクト
• 取得時に型を設定する必要がある
• データ量に注意する必要がある
• DataGrid 等と SqlDataSource を組み合わせて
ページング/ソーティングを行っている場合、
表示されるデータは該当するページ内のものだが、
ViewState には抽出されたすべてのデータが含まれる
• 通信量の増大が体感実行速度に影響
59. ページ遷移間でのステート保持
ページ遷移の方法によって利用できるものが異な
る
• リンク:クエリ文字列
• リダイレクト:クエリ文字列
• トランスファー:クエリ文字
列、 HttpContext.Items
• ページ間ポストバック: POST デー
タ、 ViewState
HttpContext.Items
• Idictionary 型- key を設定して object を格納で
きる
• HttpContext はリクエストの処理の間を通じて
存在しており、トランスファー実行時のページ間
での
データの受け渡しが可能
60. ユーザが処理を行っている間でのステート
保持
クッキー
• ブラウザ側で値を保持
• リクエスト時に毎回ブラウザからサーバに送られる
• 有効期間を設定可能
• ブラウザを閉じても存続させることが可能
• 格納できる長さに制限あり
• ブラウザの設定によっては利用不可
セッションオブジェクト
• デフォルトではセッションの判定(セッションキーを保持している)にクッ
キーを利用
• デフォルトではサーバ上のメモリにデータを格納する
• 格納できるデータはシリアライズ可能なもの
• セッションキーを保持しているブラウザから一定期間アクセスがない場合に
データは破棄される
• http はブラウザからのリクエストではじめて処理が開始されるので、サーバ側で
は
リクエストを待っているしかない
• Web.config で一定期間の設定を変更可能
61. セッション利用の設定変更
クッキーレス
<system.web>
<sessionState cookieless="UseUri"/>
</system.web>
• 携帯等クッキーを利用できないブラウザを想定する場合に設定
• セッションキーが URL に埋め込まれる
データの保存場所
<system.web>
<sessionState mode=“InProc"/>
</system.web>
• InProc
• サーバ上のメモリ内に格納される
• Session_OnEnd が発生するのはこの状態のみ
• StateServer
• 複数台のサーバがある場合、その中の一台のメモリ上に格納される
• セッションを格納するサーバで StateServer のサービスを起動する必要がある
• SQLServer
• データベース上に格納される
• aspnet_regsql.exe ツールを利用してセッション状態を保持するデータベースをインストールす
る
• セッションデータはアクセスがない状態で一定時間が経過したタイミングで削除される
62. アプリケーションが起動している間でのステート
保持
アプリケーションオブジェクト
• 格納できるデータはシリアライズ可能なもの
• 書き込み時には競合に注意
• Application.Lock ()、 Application.UnLock() を利用する
• Lock 、 UnLock はファイル書き込み等の排他制御に
利用することも可能
• 処理速度を低下させる場合もあるので利用には注意
• Web
アプリケーションは一定時間リクエストをま
ったく受け取らなかった場合に終了することに注
意
• http はブラウザからのリクエストではじめて処理が開始
されるので、サーバ側ではリクエストを待っているしか
ない
• Web.config で一定期間の設定を変更可能
• 次にリクエストを受け取ったときに起動が行われる
64. キャッシュの種類
データキャッシュ
• Cache オブジェクトにオブジェクトを追加する
• Cache オブジェクトはアプリケーション全体で利
用可能
ページの部分キャッシュ
• ユーザコントロールを作成し、 outputcache
ディレクティブを設定する
ページキャッシュの部分更新
• Substitution コントロールを利用する
ページキャッシュ
• ページに outputcache ディレクティブを設定する
• クエリ文字列毎にキャッシュを持つことが可能
65. キャッシュの生存期間
キャッシュの設定時に期間を指定
• データキャッシュ
• 時間指定
• 依存関係指定
• ファイル、ディレクトリ、他のデータキャッシュ等
• キャッシュの項目削除時に通知を受けることも可能
• この機能を利用して、定期的な処理を組み込むこともで
きる
• ページキャッシュ
• 時間指定
• SQL Server の特定テーブルの変更に依存させることも
可能
• aspnet_regsql.exe で設定
• キャッシュの配置位置をクライアント/サーバ/両方に
指定することも可能
66. キャッシュの利用にあたって
どこの負荷を下げたいのかを考慮する
• データベース/ Web サーバ/ネットワーク
表示の変更タイミングを考慮する
• データの変更頻度
• ユーザ毎に異なる表示が必要か?
調整は必要
68. コントロールの種類
HTML コントロール
• HTML ツールボックスからドラッグ アンド ドロップ
• コントロールツリーでは LiteralControl となり、サーバ上のプログラムで制御できな
い
• 記述した内容そのままが HTML となる
HTML サーバコントロール
• HTML コントロールに runat=“server” を追加
• サーバ上のプログラムで制御可能
• 記述した内容がほぼそのまま HTML となる
• デザイナー主導で HTML が先に定義されている場合等に利用できる
Web コントロール
• 標準ツールボックスからドラッグ アンド ドロップ
• サーバ上のプログラムで制御可能
• プロパティの状態によって生成される HTML が変わる
• TextBox の TextMode ( SingleLine 、 Password 、 MultiLine )
• ViewState を利用し、ポストバック前後の自分の状態を保持する
• カレンダー、データグリッドのように内部的にコントロールを持つ複合コントロール
も存在する
69. Web コントロールの動作を確認す
る
Default.aspx
<asp:TextBox ID="TextBox1" runat="server" ontextchanged="TextBox1_TextChanged"></
asp:TextBox>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
Default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
Trace.Warn("Page_Load");
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = TextBox1.Text;
Trace.Warn("Button1_Click");
}
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
Trace.Warn("TextBox1_TextChanged");
}
70. いくつかの状態を確認
下記の状態でトレースを確認
• 初期表示
• テキストボックスに「 Hello 」と入力し、ボタンをクリック
• テキストボックスを変更せず、ボタンをクリック
• テキストボックスを「 Hello World 」に変更し、 Enter キーを入力
• テキストボックスを「 Hello 」に変更し、 Enter キーを入力
確認内容
• Page_Load は常に実行される
• テキストボックスにはポストバック前のデータが表示される
• ビューステートに含まれている
• TextChanged はポストバック時に実行される
• ビューステートの内容とフォームコレクションの値が異なることを判別して
イベントが発生している
• ボタンをクリックしないと Button1_Click イベントは発生しない
• フォームコレクションに Button1 が表示されていない
71. AutoPostBack で何が起きるのか
Default.aspx
<asp:TextBox ID="TextBox1" runat="server"
AutoPostBack="True"
ontextchanged="TextBox1_TextChanged">
</asp:TextBox>
確認内容
• 生成される HTML ソースに JavaScript の記述と
その呼び出し部分が追加されている
• テキストボックスの内容を変更し、
カーソルを移動するとポストバックが発生する
• ポストバック時、 TextChanged が実行される
72. プロパティの変更と HTML 生
成
プログラムによるプロパティ変更
protected void Button1_Click(object sender, EventArgs
e)
{
Label1.Text = TextBox1.Text;
TextBox1.TextMode = TextBoxMode.MultiLine;
}
確認内容
• コントロールは自身のプロパティの値によって
生成する HTML を変更する
• プロパティの変更はデザイン時だけでなく、
プログラムによる変更も有効
73. ASP.NET でのプログラミング作業
とは
Web アプリでのサーバの作業は HTML (文字列)を
組み立てること
ASP.NET では各種コントロールを導入することで
直接文字列を組み立てることはなくなっている
• どのような HTML を生成するかは
個々のコントロールの責任
• コントロールはプロパティの値を元にそれに合わせた
HTML を生成する
• Render のタイミングまでにコントロールのプロパティを
適切に操作する作業が ASP.NET でのプログラミング作業
• ページイベント、コントロールイベントを理解し、
プロパティの操作に適切なタイミングを選択する必要がある
75. 検証コントロールの種類
RequiredFieldValidator
• 必須入力チェック
RangeValidator
• 範囲チェック
ReqularExpressionValidator
• 正規表現によるチェック
CompareValidator
• 比較チェック
CustomValidator
• 独自チェック
ValidationSummary
• 複数の Validator の ErrorMessage をまとめて表示
76. 検証コントロールの使い方
1 つのコントロールに必要なチェック項目
毎に検証コントロールを追加する
• 必須入力チェックと正規表現チェックなど
• 例:メールアドレス必須入力
ValidationSummary を利用する場
合、 ErrorMessage プロパティに詳細メッ
セージ、 Text プロパティにエラー表示を設
定する
ValidationGroup プロパティを設定すること
で
1 ページ内でチェックを行う範囲を分割す
ることができる
78. データベースの準備
項目の追加からデータベースを追加
• テーブル、各項目の追加/編集も VS 上から可能
開発にのみ利用し、運用環境は別に用意する
• 追加されるデータベースは Express Edition 特有の機能
(ユーザインスタンス)により実行されている
• データベースの管理、設定がしにくい
運用環境では別途データベースを用意し、
セキュリティやバックアップ等の管理をきちんと行う
• データベース管理の知識は必須事項
• Express Edition を利用してもよいが、ユーザインスタンスを
使わない
• 接続文字列を正しく変更すれば、プログラムの修正は必要な
い
79. データ操作用のコントロール
GirdView
• Grid 形式でのデータの表示/編集/削除が可能
• データの追加はサポートしていない
DetailsView
• 単票形式でのデータの表示/編集/削除/追加が可能
• テーブルタグを利用
FormView
• 単票形式でのデータの表示/編集/削除/追加が可能
• 自由配置
DataList
• レイアウトは自由に設定可能
• 横にデータを5つ並べるといった配置が可能
• データの追加はサポートしていない
Repeater
• データの繰り返し表示のみをサポート
ListView
• もっとも柔軟性の高い、その分複雑なコントロール
• データの表示/編集/削除/追加が可能
80. データの接続を管理する
DataSource
SqlDataSource
• SQL Server に接続する
AccessDataSource
• Access に接続する
ObjectDataSoure
• DataSet を含むオブジェクトの集合に接続する
• データの取得/更新等はオブジェクト側で実装されている必要があ
る
XmlDataSource
• XML データに接続する
SiteMapDataSource
• SiteMap データに接続する
LinqDataSource
• LINQ to SQL クラスに接続する
EntityDataSource
• Entity Data Model に接続する
81. データ操作の基本
データ操作用コントロールと DataSource を関連づ
ける
• ウィザードからの設定で簡単なデータ操作はプログラム完了
• 応用できるようにするためには、生成されるタグの意味を
きちんと理解する
表示のみであれば、 DataSource を使わなくてもよ
い
• データをなんらかの方法で取得し、データ操作用コントロー
ルにバインドすることで表示は可能
• DataBind メソッドの呼び出しが必要
• DataSource を関連付けている場合は DataBind メソッドは
自動的に呼び出される
データ操作用コントロールに渡すデータを
うまく生成することをまず考える
82. データ操作をカスタマイズするに
は
コントロールツリーを確認する
コントロールイベントの発生タイミングを確認す
る
• DataBinding 、 RowCreated など
TemplateField に変換することでより細かい動作
状況を確認できる場合もある
• TemplateField への変換は、ある意味複合化された
コントロールを分解する処理である
83. データ操作コントロール利用時の注意
点
ViewState の肥大化
• SqlDataSource のページング/ソーティングは
すべてのデータを ViewState に保持することで実現されて
いる
編集実装時の注意
• 検証コントロールを個々の入力領域に対して設定する
• TemplateField 化が必須
• 同時実行制御で利用される SQL 文に注意する
• 標準ではすべてのデータの比較
削除実装時の注意
• 標準では削除リンクをクリックしたタイミングでデータ自体
を削除
• 確認の表示を行う等の対処は考慮すべき
84. データ操作参考情報
GridView と DetailsView でデータ管理ページを作成
する
• http://codezine.jp/article/detail/379/
ASP.NET 備忘録(どっとねっとふぁん Blog 内)
• http://dotnetfan.org/blogs/dotnetfanblog/archive/category/1003.aspx
• GridView からデータを追加する
• 複数行のデータを表示/編集できる GridView
• GridView の 1 行に複数のデータを折り返して表示する
• データの値によって GridView に表示されるコントロールを変更
する
• DetailsView の内部で DropDownList を使う
• DetailsView の内部で階層的に DropDownList を使う
• GridView のページコントロールをカスタマイズする
• GirdView で削除フラグを持つテーブルを DataSource から利用す
る
86. コーディングレスでページ認証
Default.aspx
• LoginStatus
• LoginName
• ChangePassword
Login.aspx
• Login
• CreateUserWizard
Web サイト管理ツール
• 認証の種類 - インターネットから
• アクセス規則の作成 -トップディレクトリで
匿名ユーザを拒否
87. Web サイト管理ツール
.NET Framework フォルダに存在する
• C:WindowsMicrosoft.NETFrameworkv2.0.50727ASP.NET
WebAdminFiles
設定は web.config を書き換える
• 認証の種類 - インターネットから( Form 認証)
• アクセス規則の作成 -トップディレクトリで匿名ユーザを
拒否
<system.web>
<authentication mode="Forms"/>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
データベース( ASPNETDB.MDF )は自動的に生成
される
VisualStudio に含まれる機能であり、別のマシンか
らは利用できない
88. メンバーシップの基礎
認証と承認
• アプリケーションイベントとして
リクエストの処理の初期に実行される
認証
• ユーザが誰かを確認する
• ログイン後はログインチケットを元にユーザが確定され
る
• メンバーシップが有効になるのは
Form 認証の設定が行われている場合
承認
• ページへのアクセス権を確認する
• ユーザ/ロールに対して許可/拒否を設定
89. 認証の設定
デフォルト値( authentication 要素のドキュメントで確認)
<authentication mode="Windows">
<forms
name=".ASPXAUTH"
loginUrl="login.aspx"
defaultUrl="default.aspx"
protection="All"
timeout="30"
path="/"
requireSSL="false"
slidingExpiration="true"
cookieless="UseDeviceProfile" domain=""
enableCrossAppRedirects="false">
<credentials passwordFormat="SHA1" />
</forms>
<passport redirectUrl="internal" />
</authentication>
メンバーシップのための設定
<authentication mode=“Forms">
90. 承認の設定
設定例(未認証ユーザを拒否)
<authorization>
<deny users=“?” />
</authorization>
許可( allow )/拒否( deny )
すべてのユーザ(” *” ) / 未認証ユーザ(” ?” )
ロール名 / ユーザ名で個別に指定
適用順序が記述順であることに注意
• allow と deny の組み合わせがある場合に注意
<deny roles=“manager” />
<allow roles=“Admins” />
この設定を行った場合、 Admins と manager の双方に含まれるユーザは
拒否されてしまう
フォルダ/ファイル単位で設定可能
• フォルダ毎に web.config を置いて設定できる
• トップフォルダの web.config のみで設定を管理したい場合は
Location 要素を利用する
91. メンバーシップの設定
C:WindowsMicrosoft.NETFrameworkv2.0.50727CONFIGmachine.config
<membership>
<providers>
<add name="AspNetSqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider,
System.Web, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="LocalSqlServer"
enablePasswordRetrieval="false“
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="5"
minRequiredPasswordLength="7"
minRequiredNonalphanumericCharacters="1"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""/>
</providers>
</membership>
SqlMembershipProvider クラスを利用している
それぞれの設定は SqlMembershipProvider のプロパティに対応
92. メンバーシッププロバイダ
ユーザの認証情報を保存/取得する
プロバイダを置き換えることで様々なデータストアに対応
• SqlMembershipProvider
• SQL Server を利用
• ActiveDirectoryMembershipProvider
• Active Direvtory を利用
• AccessProvider
• Access を利用
• サンプルとして提供されている
• http://msdn.microsoft.com/en-us/asp.net/aa336558.aspx
以前からメンバーシップ以外のプロバイダを含めて
ソースコードが公開されている
• http://weblogs.asp.net/scottgu/archive/2006/04/13/442772.aspx
現在では Oracle もメンバーシッププロバイダを提供して
いる
93. メンバーシップ用 DB 設定
C:WindowsMicrosoft.NETFrameworkv2.0.50727CONFIGmachine
.config
<connectionStrings>
<add name="LocalSqlServer"
connectionString=“
data source=.SQLEXPRESS;
Integrated Security=SSPI;
AttachDBFilename=|DataDirectory|aspnetdb.mdf;
User Instance=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
デフォルトでは SQL Server Express Edition を利用するもの
という設定になっている
接続先データベースを変更するには LocalSqlServer の設定を
書き換える
<connectionStrings>
<remove name="LocalSqlServer"/>
<add name="LocalSqlServer"
connectionString=" 接続に必要なコネクション文字列 "
providerName="System.Data.SqlClient"/>
</connectionStrings>
94. メンバーシップ DB の構築
運用時には SQL Server 上に ASPNETDB
を構築する
既存のデータベース上に必要なテーブル、
ストアドプロシージャを構築してもよい
• DB サーバに .NET Framework がインストール
されていれば aspnet_regsql.exe を実行して
ウィザードで構築が可能
• テーブル等を生成する SQL スクリプトを
作成してもよい
• aspnet_regsql.exe –sqlexportonly ファイル名 – A all
–d データベース名
95. メンバーシップコントロール
組み合わせて利用する
• Login - アカウントとパスワードによる認
証
• CreateUserWizard - ユーザの登録
• ChangePassword - パスワード変更
• PasswordRecovery - パスワードの再送
• LoginStatus - ログイン状態表示
• LoginName - ログイン名表示
• LoginView - ログイン状態に応じ表示内容を変
更
デザインのカスタマイズ
• オートフォーマットの適用
• 各種プロパティによる変更
• テンプレートに変換すると細かい調整が可能
96. メンバーシップコントロールの表示
項目
コントロールのプロパティと web.config
の
双方の調整が必要
例: CreateUserWizard コントロールか
ら
メールと質問項目を削除
• コントロールの RequireEmail プロパティを
False に
• SqlMembershipProvider の以下の設定を確認
• requiresUniqueEmail - False
• requiresQuestionAndAnswer - False
97. メンバーシップ利用時の注意点
applicationName 要素の指定
• デフォルト - applicationName = “/”
• Web アプリケーション毎に異なる値を指定するこ
とで 1 つの DB で複数の Web アプリケーショ
ンのユーザを管理することが可能
• 逆に同じ設定をすることで、複数の Web アプリ
ケーションで同一のユーザ情報を管理することが
可能
サーバ上でユーザを管理する仕組みがない
• Web サイト管理ツールと同等の仕組みを実装する
• メンバーシップ API は用意されている
• IIS7では IIS の管理ツールに ASP.NET の
ユーザ管理が組み込まれている
99. ロールの基礎
ロールとは
• ユーザをグループ単位で認証/承認する仕組
み
認証
• ユーザをロールと関連付ける
• ASP.NET による Windows 認証時、および
Form 認証時にロールを有効にできる
承認
• ページへのアクセス権を確認する
100. ロールの設定
C:WindowsMicrosoft.NETFrameworkv2.0.50727CONFIGmachin
e.config
<roleManager>
<providers>
<add name="AspNetSqlRoleProvider"
connectionStringName="LocalSqlServer" applicationName="/"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
<add name="AspNetWindowsTokenRoleProvider" applicationName="/"
type="System.Web.Security.WindowsTokenRoleProvider, System.Web,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
SqlRoleProvider
• データベース上にロールを作成/取得
WindowsTokenRoleProvider
• ActiveDirectory からロールを取得
101. ロールの有効化
利用するための設定
• web.config の system.web 要素に以下を追加
<roleManager enabled=“true” />
Windows 認証時でも SqlRoleProvier を利用することは可能
• ユーザとロールの関連付けが必要
ロールを作成するには
• IIS7 なら管理ツールから
• IIS6 までだと Global.asax を利用する等
void Application_Start(object sender, EventArgs e)
{
if(!Roles.RoleExists("Administrator"))
Roles.CreateRole("Administrator");
}
ロールとユーザの関連付け
• IIS7 なら管理ツールから
• IIS6 だとプログラム上から設定
Roles.AddUsersToRole ( new string[] { “ ユーザ名” }, “Administrator”);
102. ロールの利用
フォルダ単位で web.config にて設定
• メンバーシップの承認と同じ
ロールのアクセス権と Menu / TreeView を連携する(セキュリティト
リミング)
ルート web.config
<siteMap defaultProvider="XmlSiteMapProvider" enabled="true">
<providers>
<add name="XmlSiteMapProvider" type ="System.Web.XmlSiteMapProvider" securityTrimmingEnabled="true"
siteMapFile="Web.sitemap"/>
</providers>
</siteMap>
SiteMap ファイル
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="Default.aspx" title="root">
<siteMapNode url=“AdminDefault.aspx” title=“Adminroot” description=“” roles=“Admin” /
>
<siteMapNode url=“UserDefault.aspx” title=“Userroot” description=“” roles=“User” />
</siteMapNode>
</siteMap>
SiteMapNode のすべてに url が設定されている必要がある
104. ユーザコントロールとは
いくつかのコントロールをまとめて 1 つのコントロ
ールのように扱うための仕組み
• ascx ファイル上にコントロールを配置し、処理を記述
• ascx ファイルのドラッグ アンド ドロップで
aspx ページ内にユーザコントロールを追加
• ascx ファイルにパブリックなプロパティを記述することで
、
aspx ページとのデータのやりとりが可能に
貼り付けたコントロールは、 aspx ページの一部とし
て
動作する
• aspx ページのページイベントの中でユーザコントロールの
各イベントが呼ばれる
• aspx ページに貼り付けられたユーザコントロールは
ページ毎に別のコントロールとして動作する
106. マスターページとは
主にサイトの外観を統一するために利用される仕
組み
• フレームとは異なる
• 仕組みとしては特殊なユーザコントロールと考えたほう
がよい
• 読み込まれる各 aspx ページの一部として動作する
• マスターページに相対的なリンクを記述することは避ける
階層を重ねることが可能
• ASP.NET としては以前から可能であったが、
IDE としては VS2008 からサポート
コンテンツ領域( ContentPlaceHolder )は
複数設定することが可能
108. UpdatePanel による簡単 AJAX
Default.aspx
• テキストボックス、ボタン、ラベルを追加
Default.aspx.cs
protected void Button1_Click(object sender, EventArgs
e)
{
Label1.Text = TextBox1.Text;
}
動作を確認後 Default.aspx に以下を追加
• ScriptManager
• UpdatePanel
• テキストボックス、ボタン、ラベルを UpdatePanel 内に移動
109. 何が起きているのか
HTML ソースに
WebResource.axd 、 ScriptResource.axd が追加されてい
る
• ダウンロードされる js ファイルを VS2008 から確認可能
• MicrosoftAjax.js
• MicrosoftAjaxWebForm.js
HTML の form 、 input type = “submit” 等が
変更されているわけではない
• Submit は MicrosoftAjaxWebForms.js の _onFromSubmit に置き
換えられる
• Sys$WebForms$PageRequestManager$_onFormSubmit
Update パネル利用時は基本的に通常の Postback と同じ
リクエストがあがり、書き換えが部分的に行われる
• AJAX を利用することによる処理の効率化はあまりはかられない
• プログラミング自体はとても簡単
110. ASP.NET AJAX とは
ScriptManager を追加することによってダウンロードされ
る
js ファイルをうまく利用するもの
• JavaScript は後付け(上書き)でオブジェクトのプロパティを追
加したり、
メソッドを書き換えたりすることができる
• js ファイルそのものは IE 以外のブラウザへの対応もなされてい
る
• 独自の JavaScript を記述し、 AJAX の js ファイルを利用するこ
とができる
• ASP.NET AJAX Control Toolkit は Web コントロールと AJAX の
js ファイルをうまく連携できるようにしているもの
• http://www.asp.net/ajax/ajaxcontroltoolkit/
UpdatePanel は便利だが、それに限定されるものではな
い
今後、 JQuery (オープンソースのライブラリ)がサポー
トされる
112. Dynamic Data ( 3.5 SP1 )
• データ管理システムをコーディングレスで構築
• LINQ to SQL 、 Entity Framework に対応
ADO.NET Data Services ( 3.5 SP1 )
• REST ベースのデータの Web サービス管理をコーディングレスで構築
• Entity Framework に対応
Chart コントロール
• 各種チャートの生成を行う
ASP.NET MVC
• Model View Controller パターンに基づいたフレームワークを ASP.NET 上
に実装したもの
• テスト駆動開発が可能
• Web フォームコントロールを使わずに Web アプリを構築する
• より細かい制御が可能であるが、その分細かい作業が必要となる