SlideShare una empresa de Scribd logo
1 de 126
2 日で学ぶ ASP.NET の基礎

 Visual Studio User Group
 Web アプリケーションフォーラムリーダー
         小野 修司 (どっとねっと
 ふぁん)
                    
    2008/5/24 - 25
Agenda
Web アプリケーションの
特徴
Web アプリケーションの特徴
 「ブラウザ」と「サーバ」間のやりとり
を繰り返して一連の処理を行う
 • ブラウザ
  • サーバにリクエストをあげる
  • サーバから受け取った HTML ( JavaScript を含む
   )を解釈してユーザインタフェースを表示する
 • サーバ
  • ブラウザから受け取ったリクエストに応じた処理を
   行い、 HTML を組み立ててブラウザに返す
    •   HTML というソースコードを生成している、と考え
        られる
  • 複数のブラウザからのリクエストを同時処理
Web アプリケーションの構築/デバッグに必要な
知識

 サーバ

 • Web サーバ、データベースサーバの設定/管
  理
 クライアント
                    
 • ブラウザによる実装の違い
   • HTML 、 CSS 、スクリプト
 ネットワーク

 • TCP/IP 、 http
 セキュリティ
http 基礎
http 基礎
   サーバへのリクエストがあって、はじめてレスポン
    スが返る
    •   サーバから一方的にデータを送りつけることはできない
   サーバはステート(前回のリクエスト状態等)を持
    たない
    •   ブラウザから次のリクエストが送られることを予期しない
   利用されるメソッド
    •   GET
        •   ブラウザに URL を入力し、リターンキーを押したとき
        •   指定した URL に相当するページを返すようサーバに指示
        •   クエリ文字列を利用することで引数的にデータを渡せる
        •   文字数制限あり( IE 2,083 文字)
    •   POST
        •   入力欄にデータを入力し、ボタン等を押したとき
        •   入力されたデータ等をサーバに渡す
        •   送信先ページは action で指定
        •   文字数制限なし
実習 1 -準備
   Index.htm (新しい項目で追加)
    <html>
    <body>
    <form method="post" action="Default.aspx">
       <input id="Text1" type="text" name="Text1" />
       <input id="Submit1" type="submit" value=" 送信 " />
    </form>
    </body>
    </html>

   Default.aspx
    •   ラベル( Label1 )を追加

   Default.aspx.cs
     protected void Page_Load(object sender, EventArgs e)
       {
         this.Label1.Text = Request.Form["Text1"];
       }
実習 1
 telnet   による動作確認
     telnet> open   localhost ポート番号
     GET / プロジェクト名 /Index.htm HTTP/1.1
     Host: localhost


  • HTML が返される
 Trace    による動作確認
  • Default.aspx の Page ディレクティブ
     •   Trace=“true”
  • 入力されたデータがリクエストに含まれる
  • 生成された HTML を確認
実習 1 での理解
   http による通信は文字列のやりとりである
    • ブラウザとサーバで共通のデータを扱うためにはその
     データを文字列化してリクエスト/レスポンスに含め
     る必要がある

   http による通信は必ずリクエストからはじまる

   ブラウザは HTML を解釈して画面表示を行う
    • サーバは HTML というソースコードを生成する
    • サーバ上でできる処理(ソースコード生成-文字列組
     み立て)とブラウザでできる処理(画面表示変更)を
     区別した設計が必要

   ASP.NET も http の上になりたっている
ASP.NET の特徴
ASP.NET の特徴
 PostBack   が基本
  • form タグの action 先が自分自身
    •   ASP 等では action 先を別のページにし、データ入力ペー
        ジとデータ処理ページを分けるのが一般的だった
  • イベントドリブン型の開発のための仕掛け
 コンパイルによる処理速度向上
  • aspx ファイルはソースコード化されコンパイル
  • 最初の実行開始時に dll が作成される
    •   ソースの修正等をしなければ dll はそのまま利用される
  • 実行時にメソッド単位で JIT コンパイルされるの
   は Windows アプリ等と同じ
実習 2 -準備
 Default.aspx

  • Trace=“true”
  • テキストボックス、ボタン、ラベルを追加
 Default.aspx.cs
    protected void Button1_Click(object sender,
      EventArgs e)
      {
         Label1.Text = TextBox1.Text;
      }
実習 2
   初期表示時の要求の種類の確認

   ソース/ HTML の確認
    •   form タグに注目

   ボタンクリック後の要求の種類の確認

   テンポラリーファイルの内容確認
    •   VISTA VS2008
         •   C:UsersUserNameAppDataLocalTempTemporary ASP.NET
             Files
    •   VS2005 まで
         •   C:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary
             ASP.NET Files
    •   d ll、ソースコード( debug 時)、その他
実習 2 での理解
 ASP.NET   の基本は PostBack
  • runat=“server” が記されている form は Page
   に1つしか存在できず、必ず action が自分自
   身になる


   からソースが自動生成され、コンパ
 aspx
 イルが行われる
ASP.NET の実行環境
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 を指定する
IIS6 上の Web アプリケーショ
ン
   フォルダをアプリケーションとして「設定
    」する
    • 仮想ディレクトリでも実フォルダでも可能
    • 標準で仮想ディレクトリを追加すると、アプリケ
      ーションとして設定済みとなる
    • 仮想ディレクトリはアプリケーションとして設定
        せず、単に実ディレクトリ構成とは異なるフォル
        ダ階層を実現するためにも利用可能

   アプリケーションの設定とは
    • Windows アプリケーションの1つの exe ファイル
        と個々のアプリケーション設定が対応するイメー
        ジ
    •   アプリケーションの境界
        • Framework のバージョン
         セキュリティ/アクセス制御
IIS6 の認証と ASP.NET の認
証
   IIS 側でも認証設定が可能
    •   匿名
    •   基本認証
    •   統合 Windows 認証

   ASP.NET にも認証機能がある
    •   Form 認証
        • DB ベース
        • Active Directory ベース
    •   Windwos 認証

   ASP.NET の認証機能を利用するほうが細かい設
    定が容易
    •   IIS 側は匿名を許可しておく
開発サーバと IIS の違い
   VS2005 以降には開発サーバが含まれており
    、その上で動作検証が可能
   開発サーバと IIS では動作が異なる
    • ファイルマッピング
     • 開発サーバ - すべてのファイルが ASP.NET によって処
       理される
     • IIS - アプリケーションの構成で ASP.NET に関連づけ
         られた拡張子のファイルのみ ASP.NET によって処理さ
         れる
     •   開発サーバでは web.config によるアクセス制御が画像フ
         ァイル等にも影響する
    • 実行ユーザ
     • 開発サーバ - ログイン中のユーザの権限で実行される
     • IIS - ASPNET ユーザまたは Network Service ユーザの
       権限で実行される
     • ファイルへの書き込み等を行っている場合に注意
実習 3
   Default.aspx
    •   ラベルを追加

   Default.aspx.cs
     protected void Page_Load(object sender, EventArgs e)
       {
         Label1.Text =
               System.Security.Principal.
               WindowsIdentity.GetCurrent().Name;
       }

   開発サーバと IIS で実行ユーザが異なることを確
    認
IIS7 と ASP.NET
   ASP.NET を有効にすることで実行可能

   IIS 7は ASP.NET をベースに進化したも
    のと考えてよい
    • ファイルはすべて ASP.NET によって処理され
        る
    •   実行ユーザは NT AUTHORITYNETWORK
        SERVICE
    •   ASP.NET の設定と IIS7 の設定ツールが一体化
        している
        • 一部 web.config の書き方が異なるので注意
ASP.NET の設定
ASP.NET の設定
   マシン全体の設定
    •   C:WindowsMicrosoft.NETFrameworkv2.0.50727CONFIG
         •   machine.config
         •   web.config
    •   デフォルトの設定については config に記述されていないものも
         •   初期起動時の速度を早くするため、ハードコーディングされている
         •   ドキュメントにて確認できるものもある

   アプリケーション単位の設定
    •   アプリケーションとして設定されているフォルダに存在する
        web.config
    •   設定の種類によってはこの場所に記述しないと有効にならないもの
        がある
    •   マシン全体の設定を引き継ぐ

   下層のフォルダ単位の設定
    •   各フォルダに存在する web.config
    •   アプリケーション単位の web.config 内に含めることも可能
    •   上位フォルダの設定を引き継ぐ
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 の参照と利用するコンパイラ
        の設定が追加される
リクエストが処理されるし
くみ
リクエストが処理されるしくみ
概要
   ブラウザからリクエストがあがる
   http コンテキストが作られる
   アプリケーションイベントが発生する
    • アプリケーションイベントの発生順序は固定
    • ページの処理が行われる
     • ページイベントが発生する
     • ページイベントの発生順序は固定
     • ポストバック時はコントロールイベント、ポストバック
      イベントが発生する
   レスポンスが返される
    • ページ、 http コンテキストのインスタンスは破棄
HttpContext
   リクエストがあがってきてレスポンスを返すまで生存して
    いる
    •   グローバル変数のような意味を持つインスタンスとなっている
   以下のようなデータを格納
    •   リクエストの内容
    •   レスポンスの内容
    •   アプリケーションオブジェクト
    •   セッションオブジェクト
    •   キャッシュデータ
    •   ユーザ情報
   http コンテキストの内容を書き換えることで ASP.NET の
    動作を変えることが可能
    •   例: URL リライト
      • Context.Rewritepath
   現在のコンテキストは HttpContext.Current で取得
    •   Page の中では Context プロパティで取得可能
    •   独自クラスの中で HttpContext.Current を利用
アプリケーションイベント
   アプリケーションイベントの発生順序は固定
   HttpApplication クラスのドキュメントで確認
      BeginRequest                リクエストの処理開始時に発生
      AuthenticateRequest         認証の開始時に発生
      PostAuthenticateRequest     認証の終了時に発生
      AuthorizeRequest            承認の開始時に発生
      PostAuthorizeRequest        承認の終了時に発生
      ResolveRequestCache         キャッシュの処理の開始時に発生
      PostResolveRequestCache     キャッシュの処理の終了時に発生
      PostMapRequestHandler       ハンドラの生成後に発生
      AcquireRequestState         セッション等の状態の取得時に発生
      PostAcquireRequestState     セッション等の状態の取得後に発生
      PreRequestHandlerExecute    ハンドラの実行前に発生
      PostRequestHandlerExecute   ハンドラの実行後に発生
      ReleaseRequestState         セッション等の状態の開放時に発生
      PostReleaseRequestState     セッション等の状態の開放後に発生
      UpdateRequestCache          キャッシュの状態更新時に発生
      PostUpdateRequestCache      キャッシュの状態更新後に発生
      EndRequest                  リクエストの処理終了時に発生
実習 4 -準備
   Global.asax

        void Application_BeginRequest(object sender, EventArgs e)
       {
         string t = "test";
       }

       void Application_AuthenticateRequest(object sender, EventArgs e)
       {
         string t = "test";
       }

       void Application_PostMapRequestHandler(object sender, EventArgs e)
       {
         string t = "test";
       }
実習 4
   各イベント内にブレークポイントを設定

   ウォッチウィンドウで
    HttpContext.Current のプロパティの状態
    を確認
    • User
    • Handler
実習 4 での理解
   アプリケーションイベントを通り抜けて
    いくことで HttpContext が変化していく
    ことを確認する

   ウォッチウィンドウでインスタンスの状
    態を確認する方法を理解する
HttpModule
   アプリケーションイベントをトリガにし
    て実行する処理をまとめて登録するしく
    み
   IHttpModule インタフェースを継承した
    クラスで最低限 Init メソッドと Dispose
    メソッドを実装する
    • Init メソッド-アプリケーションイベントにプ
        ライベートメソッドを登録する
    •   Dispose メソッド-通常は空でよい
   作成したクラスを web.config で登録する
実習 5 -準備
   App_Code/TestModule.cs

     public class TestModule : IHttpModule
     {
       public void Init(HttpApplication context)
       {
          context.BeginRequest += new EventHandler(context_BeginRequest);
          context.EndRequest += new EventHandler(context_EndRequest);
       }

       public void Dispose()
       {
       }

        void context_BeginRequest(object sender, EventArgs e)
      {
        HttpContext.Current.Items["startTime"] = DateTime.Now;
      }

        void context_EndRequest(object sender, EventArgs e)
       {
          HttpContext.Current.Response.Write(        
         DateTime.Now.Subtract((DateTime)HttpContext.Current.Items["startTime"]).Milliseconds.ToString()
          );
       }
     }
実習 5
   web.config
    <httpModules>
    <add name=“TestModule”   type="TestModule"/
      >
    </httpModules>


   ページ最下段に処理にかかった時間数(
    ミリ秒)が表示される
   web.config の設定を消すと時間数は表示
    されない
実習 5 での理解
   すべてのリクエストに対する処理を
    HttpModule で登録することができる

   web.config の設定で簡単に処理の組み込
    みが可能
実装済の 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 で実装されている
HttpModule の利用例
   URL リライト
    •   http://localhost/id/1/default.aspx ← ブラウザからのリクエ
        スト
    •   http://localhost/default.aspx?id=1 ← 内部処理でのリクエス
        ト

    •   DotNetNuke 等で実装
    •   SEO 対策、検索エンジン対策

    •   .NET Framework 3.5 SP1 で ASP.NET ルーティングが提供
        され必要性は減少する

   IIS7 ではマッピングに制限されずすべてのリクエス
    トに対して HttpModule を適用できるようになるため
    、利用を考慮する機会は増える
ページ毎の処理
ページ毎の処理
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 に制御が渡されていることが前提
ashx ファイル
   もっともシンプルな IHttpHandler 実装
    • IsReusable メソッド
      • false を返す

    • ProcessRequest
      • 処理を記述
      • Context.Response にブラウザに返したいデータを
        書き込む
実習 6-1
   test.ashx ファイルを追加
    • サンプルコードが記述されている

   実行して生成されるソース HTML を確認
    • ashx ファイルでは書き込んだデータしか表示
     されない
ashx の利用例
   画像ファイルや文書ファイルのダウンロ
    ード時に ASP.NET の処理を追加したい
    場合
    • ダウンロード回数のカウント
    • 認証済みユーザにのみダウンロードを許可

   出力する内容を完全にコントロールでき
    る
    • aspx ファイルを利用すると、意図しない出力
     が追加される場合も
実習 6-2 -準備
   test.aspx ファイルを App_Code 下に移動
    し、拡張子を .cs に変更する
   WebHandler ディレクティブを削除する

   web.config に追加
    <httpHandlers>
     <add verb="*" path ="*.myx" type="test"/>
    </httpHandlers>
実習 6-2
   ブラウザから test.myx 、 hello.myx 等、
    適当な名前の .myx ファイルにアクセスす
    る

   どの場合でも「 Hello World 」が返され
    ることを確認する
HttpHandler の利用例
   静的表示の多いサイトでコンテンツと表現
    を分離して管理する
    • コンテンツの内容を XML で作成
    • Handler 内で XML に XSLT を適用し、 HTML を生
        成
    •   XSLT の変更で生成される HTML は自由に変更可
        能
    •   マイクロソフトサイトの mspx

   IIS6 上で利用するには拡張子のマッピング
    が必要
    • IIS7 ではマッピングは必要ない
aspx ファイル
   System.Web.UI.Page クラスを継承
    •   IHttpHandler インターフェイスを継承している

   内部に多くのコントロールを持つ
    •   通常ツールボックスからのドラッグ アンド ドロップで
        追加

   ページライフサイクル
    •   ページのインスタンスはリクエスト毎に生成され消滅
        する
        • 初期表示時のインスタンスとポストバック時のインスタンス
         に関連は存在しない(ステートレス)
    •   ページが生成して消滅するまでにページイベントが決
        まった順番で発生する
実習 7-1
 Default.aspx

  • Trace=“true”
  • テキストボックス、ボタン、ラベルを追加
 Default.aspx.cs
    protected void Button1_Click(object sender,
      EventArgs e)
      {
         Label1.Text = TextBox1.Text;
      }
コントロールのツリー
   _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 終了タグ

   ソースコードで対応を確認
コントロールツリー
   aspx 内のすべての要素がコントロール化
    され Page クラスを根とするツリー構造
    内で管理される
    • 文字列 →  LiteralControl
    • ツリーの階層構造 = タグの階層構造
コントロールの種類
   HTML コントロール
    •   HTML ツールボックスからドラッグ アンド ドロップ
    •   コントロールツリーでは LiteralControl となり、サーバ上のプログラムで制
        御できない
    •   記述した内容そのままが HTML となる

   HTML サーバコントロール
    •   HTML コントロールに runat=“server” を追加
    •   サーバ上のプログラムで制御可能
    •   記述した内容がほぼそのまま HTML となる

   Web コントロール
    •   標準ツールボックスからドラッグ アンド ドロップ
    •   サーバ上のプログラムで制御可能
    •   プロパティの状態によって生成される HTML が変わる
         •   TextBox の TextMode ( SingleLine 、 Password 、 MultiLine )
    •   ViewState を利用し、ポストバック前後の自分の状態を保持する
    •   カレンダー、データグリッドのように内部的にコントロールを持つ複合コン
        トロールも存在する
ページイベント
     初期表示時                        ポストバック時
      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
ページイベントによる処理
   初期化
   コントロールツリーの作成
   リクエスト読み込み
    •   ポストバック時のみ
    •   ビューステート、ポストデータを各コントロールに割り当て
   コントロールイベント
    •   ポストバック時のみ
    •   ビューステートとポストデータの違いからコントロールイベントが
        発生
   ポストバックイベント
    •   ポストバック時のみ
    •   ポストバックの原因となったイベントが発生
   レンダリング
    •   各コントロールがプロパティの状態を元に自分自身を HTML 化し、
        レスポンスに追加
AutoEventWireup
   ASP.NET 2.0 以降はデフォルトで true
   下記のメソッド呼び出しがハードコーディングされており、該当するメソ
    ッドを作成しておけば自動的に呼び出される
    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
   これ以外のイベント発生時のメソッド呼び出しは初期化時に登録を行う必
    要がある
実習 7-2 -準備
   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");
       }
実習 7-2
   下記の状態でトレースを確認
    •   初期表示
    •   テキストボックスに「 Hello 」と入力し、ボタンをクリック
    •   テキストボックスを変更せず、ボタンをクリック
    •   テキストボックスを「 Hello World 」に変更し、 Enter キー
        を入力
    •   テキストボックスを「 Hello 」に変更し、 Enter キーを入力

   確認内容
    • Page_Load は常に実行される
    • テキストボックスにはポストバック前のデータが表示される
       • ビューステートに含まれている
    • TextChanged はポストバック時に実行される
       • ビューステートの内容とフォームコレクションの値が異なるとき
    • ボタンをクリックしないと Button1_Click イベントは発生し
        ない
        •   フォームコレクションに Button1 が表示されていない
実習 7-3
   Default.aspx
    <asp:TextBox ID="TextBox1" runat="server"
      AutoPostBack="True"
    ontextchanged="TextBox1_TextChanged">
      </asp:TextBox>

   確認内容
    • 生成される HTML ソースに JavaScript の記述とそ
        の呼び出し部分が追加されている
    •   テキストボックスの内容を変更し、カーソルを移
        動するとポストバックが発生する
    •   ポストバック時、 TextChanged が実行される
たまにある質問
   その1
    • Response.Write で書き込んだ内容がページの
     先頭に書き込まれます

   その2
    • DropDownList にデータバインディングでデー
     タを表示しています。 Page_Load で初期表示
     値を設定したいんですができません
実習 8 -準備
   Default.aspx
     •    ラベルを追加

   Default.aspx.cs
           protected void Page_Load(object sender, EventArgs e)
          {
            Label1.Text = " ロード時に設定 ";
            Response.Write("Page_Load");
          }
          protected void Page_PreRender(object sender, EventArgs e)
          {
            Response.Write("Page_PreRender");
          }
          protected void Page_SaveSateComplete(object sender, EventArgs e)
          {
            Response.Write("Page_SaveStateComplete");
          }
実習 8 での理解
   Response.Write とページを含むコントロー
    ルの HTML 生成/書き込みタイミングが異
    なる
    • Response.Write は呼び出されたタイミングで渡さ
        れたデータを httpContext が持つ Response に書き
        込む
    •   Page およびそれに含まれるコントロールは
        Render のタイミングで自分自身を HTML 化
        し、 httpContext が持つ Response に書き込む
    •   Render 終了後は Response.Write でデータを書き
        込むことはできない

   結論: Response.Write は Page の中では使
    わない
実習 9 -準備
   id と dataName 項目を持つテーブルとデータを準備

   Default.aspx
    •    Trace=“true”
    •    DropDownList を追加し、 SqlDataSource でバインディング

   Default.aspx.cs
          protected void Page_Load(object sender, EventArgs e)
         {
           DropDownList1.SelectedValue = "3";
         }
         protected void DropDownList1_DataBound(object sender,
         EventArgs e)
         {
           Trace.Warn("DataBound");
         }
実習 9
   Page_Load 内で
    DropDownList.DataBind() を実行すると
    DataBound のタイミングが変わることを
    確認する
    • デフォルトの実行は PreRender

   .NET Framework 3.5 ( SP1? )でこの問
    題への対処が行われていると思われる
    • それ以前のバージョンではデータのバインデ
     ィング後でなければ SelectedValue 等が動か
     なかった
ASP.NET でのプログラミング作業
とは
   Web アプリでのサーバの作業は HTML (文字列
    )を組み立てること
   ASP.NET では各種コントロールを導入すること
    で直接文字列を組み立てることはなくなっている
    •   どのような HTML を生成するかは個々のコントロール
        の責任
    •   コントロールはプロパティの値を元にそれに合わせた
        HTML を生成する
    •   Render のタイミングまでにコントロールのプロパティ
        を適切に操作する作業が ASP.NET でのプログラミング
        作業
    •   ページイベントを理解し、プロパティの操作に適切な
        タイミングを選択する必要がある
リクエストが処理される仕組み-ま
とめ

• 一連の流れ(どのタイミングで何が起きているか
 )が理解できればフレームワーク自体を新たに作
 ることも可能
ページ遷移
ページ遷移
   ASP.NET の基本は PostBack であるため
    form タグによるページ遷移は難しい
    • HTML コントロールとしての form タグは利用
     可能だが、 Web コントロールと組み合わせる
     と使い方が難しい

   通常利用されるページ遷移の方法
    • リンク
    • リダイレクト
    • トランスファー
    • 別ページポストバック
リンク
   ユーザのクリックにより指定先の URL を
    表示
    • リンク先が異なる Web アプリケーションでも
     遷移が可能
     • ASP.NET のサイトに限らない
    • GET メソッドを利用した遷移
     • クエリ文字列を利用したデータの引渡しは可能
     • URL の長さに制限あり
リダイレクト
   サーバの処理中にリダイレクトを記述する
    • 実際にはブラウザに対して指定した URL に
     GET メソッドを発行するよう指示するレスポン
     スが送られる
     • ブラウザとのやりとりが発生する
    • リンク先やリンク元が異なる Web アプリケー
     ションでも遷移が可能
     • ASP.NET のサイトに限らない
    • GET メソッドを利用した遷移
     • クエリ文字列を利用したデータの引渡しは可能
     • URL の長さに制限あり
トランスファー
   サーバの処理中にトランスファーを記述す
    る
    • 実際には指定したページのインスタンスが生成さ
        れ、そのページの処理が開始される
    •   トランスファーの遷移先は同一の Web アプリケー
        ション内に限定される
    •   1つのリクエストの処理の中で実行されるページ
        のインスタンスが置き換わるため、ブラウザの
        URL は遷移前のまま変わらない
    •   1 つのリクエストの処理の中で実行されるページ
        が置き換わるため、ページの認証、承認といった
        アプリケーションイベントは遷移前のページに対
        して行われ、遷移後のページに対しては実行され
        ない
        一般的には使わない
トランスファーのイメージ
別ページポストバック
   ボタン、リンクボタン、イメージボタン
    の PostBackUrl オプションに遷移先を設
    定する
   ボタンクリックにより指定した遷移先が
    呼び出される
    • POST メソッドを利用した呼び出しが行われ
        る
    •   JavaScript を利用して form のポスト先を書き
        換えている
    •   遷移した先が同一 Web アプリケーションであ
        れば PreviousPageType ディレクティブを設
        定して遷移元で公開しているプロパティの値
        を取得可能
実習 10 -準備
   Default.aspx
     •    テキストボックス、ボタンを追加
     •    ボタンの PostBackUrl プロパティに Default2.aspx を設定
   Default.aspx.cs
           public string MyText {
            get { return TextBox1.Text; }
          }

   Default2.aspx
     •    Trace=“true”
     •    <%@ PreviousPageType VirtualPath="~/Default.aspx" %>
     •    ラベルを追加
   Default2.aspx.cs
       protected void Page_Load(object sender, EventArgs e)
      {
        Label1.Text = PreviousPage.MyText;
      }
実習 10
   Default.aspx でテキストボックスに何か
    入力してボタンをクリック
   Default2.aspx に遷移することを確認
   Default2.aspx でブレークポイントを設定
    し、 PreviousPage の型を確認
   Default2.aspx のメソッド、フォームコレ
    クションを確認
実習 10 での理解
   別ページポストバックで利用する
    JavaScript は WebResource.axd を介してダ
    ウンロードされる
    • JavaScript によって form の action が書き換えられ
        る
    •   form のメソッドは post のまま
   POST には POST データ、 ViewState が含
    まれる
    • PreviousPageType で指定されたページのインスタ
        ンスを生成し、そこに ViewState を読み込ませる
        ことにより Public なプロパティを取り出せるもの
        と思われる
ステート保持
ステート保持
   Web アプリケーションの基本はステート
    レス
    • ページの遷移時だけでなく、ポストバック時
     も以前の状態を保持できない
   アプリケーションとして一連の処理を実
    行するためには様々な長さでステートを
    保持できる必要がある
    • ポストバック間
    • ページ遷移間
    • ユーザが処理を行っている間
    • アプリケーションが起動している間
ポストバック間でのステート保
持
   ViewState
    • Web コントロールはデフォルトで ViewState を利
      用する
       • ページ単位、コントロール単位で制御可能
    • プログラムから独自に利用することも可能
       • 格納できるのはシリアライズ可能なオブジェクト
       • 取得時に型を設定する必要がある
    • データ量に注意する必要がある
       • DataGrid 等と SqlDataSource を組み合わせてページング
           /ソーティングを行っている場合、表示されるデータは
           該当するページ内のものだが、 ViewState には抽出され
           たすべてのデータが含まれる
       •   通信量の増大が体感実行速度に影響
ページ遷移間でのステート保持
   ページ遷移の方法によって利用できるもの
    が異なる
    • リンク:クエリ文字列
    • リダイレクト:クエリ文字列
    • トランスファー:クエリ文字
      列、 HttpContext.Items
    • ページ間ポストバック: POST デー
      タ、 ViewState

   HttpContext.Items
    • IDictionary 型- key を設定して object を格納でき
      る
    • HttpContext はリクエストの処理の間を通じて存在
      しており、トランスファー実行時のページ間での
      データの受け渡しが可能
ユーザが処理を行っている間でのステート
保持
   クッキー
    •   ブラウザ側で値を保持
    •   リクエスト時に毎回ブラウザからサーバに送られる
    •   有効期間を設定可能
        •   ブラウザを閉じても存続させることが可能
    •   格納できる長さに制限あり
    •   ブラウザの設定によっては利用不可

   セッションオブジェクト
    •   デフォルトではセッションの判定(セッションキーを保持している)にクッ
        キーを利用
    •   デフォルトではサーバ上のメモリにデータを格納する
    •   格納できるデータはシリアライズ可能なもの
    •   セッションキーを保持しているブラウザから一定期間アクセスがない場合に
        データは破棄される
        •   http はブラウザからのリクエストではじめて処理が開始されるので、サーバ側で
            はリクエストを待っているしかない
        •   Web.config で一定期間の設定を変更可能
セッション利用の設定変更
   クッキーレス
        <system.web>
           <sessionState cookieless="UseUri"/>
        </system.web>
    •   携帯等クッキーを利用できないブラウザを想定する場合に設定
    •   セッションキーが URL に埋め込まれる

   データの保存場所
        <system.web>
          <sessionState mode=“InProc"/>
        </system.web>
    •   InProc
         •   サーバ上のメモリ内に格納される
         •   Session_OnEnd が発生するのはこの状態のみ
    •   StateServer
         •   複数台のサーバがある場合、その中の一台のメモリ上に格納される
         •   セッションを格納するサーバで StateServer のサービスを起動する必要がある
    •   SQLServer
         •   データベース上に格納される
         •   aspnet_regsql.exe ツールを利用してセッション状態を保持するデータベースをインストールす
             る
         •   セッションデータはアクセスがない状態で一定時間が経過したタイミングで削除される
アプリケーションが起動している間でのステート
保持

   アプリケーションオブジェクト
    • 格納できるデータはシリアライズ可能なもの
    • 書き込み時には競合に注意
     • Application.Lock ()、 Application.UnLock() を利用する
     • Lock 、 UnLock はファイル書き込み等の排他制御に利用
         することも可能
     •   処理速度を低下させる場合もあるので利用には注意
    • Web アプリケーションは一定時間リクエストをま
     ったく受け取らなかった場合に終了することに注
     意
     • http はブラウザからのリクエストではじめて処理が開始
         されるので、サーバ側ではリクエストを待っているしか
         ない
     •   Web.config で一定期間の設定を変更可能
     •   次にリクエストを受け取ったときに起動が行われる
キャッシュ
キャッシュの種類
   データキャッシュ
    • Cache オブジェクトにオブジェクトを追加する
    • Cache オブジェクトはアプリケーション全体で利
     用可能
   ページの部分キャッシュ
    • ユーザコントロールを作成し、       outputcache ディ
     レクティブを設定する
   ページキャッシュの部分更新
    • Substitution コントロールを利用する
   ページキャッシュ
    • ページに outputcache ディレクティブを設定する
    • クエリ文字列毎にキャッシュを持つことが可能
キャッシュの生存期間
   キャッシュの設定時に期間を指定
    • データキャッシュ
     • 時間指定
     • 依存関係指定
        • ファイル、ディレクトリ、他のデータキャッシュ等
     • キャッシュの項目削除時に通知を受けることも可能
        • この機能を利用して、定期的な処理を組み込むこともで
          きる
    • ページキャッシュ
     • 時間指定
     • SQL Server の特定テーブルの変更に依存させることも可
      能
       • aspnet_regsql.exe で設定
     • キャッシュの配置位置をクライアント/サーバ/両方に
      指定することも可能
キャッシュの利用にあたって
   どこの負荷を下げたいのかを考慮する
    • データベース/ Web サーバ/ネットワーク

   表示の変更タイミングを考慮する
    • データの変更頻度
    • ユーザ毎に異なる表示が必要か?
   調整は必要
ASP.NET AJAX の基礎
実習 11 -準備
   Default.aspx
    •    テキストボックス、ボタン、ラベルを追加

   Default.aspx.cs
          protected void Button1_Click(object sender, EventArgs
         e)
         {
            Label1.Text = TextBox1.Text;
         }

   動作を確認後 Default.aspx に以下を追加
    •    ScriptManager
    •    UpdatePanel
          •   テキストボックス、ボタン、ラベルを UpdatePanel 内に移動
実習 11 での理解
   HTML ソースに
    WebResource.axd 、 ScriptResource.axd が
    追加されている
    • ダウンロードされる js ファイルを VS2008 から確
      認可能
      • MicrosoftAjax.js
      • MicrosoftAjaxWebForm.js
   HTML の form 、 input type=“submit” 等が変
    更されているわけではない
    • Submit は MicrosoftAjaxWebForms.js の
      _onFromSubmit に置き換えられる
      • Sys$WebForms$PageRequestManager$_onFormSubmit
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 は便利だが、それに限定されるもの
    ではない
メンバーシップ
実習 12
   Default.aspx
    • LoginStatus
    • LoginName
    • ChangePassword
   Loain.aspx
    • Login
    • CreateUserWizard
   Web サイト管理ツール
    • 認証の種類 - インターネットから
    • アクセス規則の作成 -トップディレクトリで匿
      名ユーザを拒否
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 )は自動的に生成
    される
   サーバ上の Web サイト管理ツールを外部から利用す
    ることはできない
メンバーシップを理解するには
   様々な設定を理解する必要がある
    • 認証設定
    • 承認設定
    • メンバーシップ設定
    • メンバーシップ用 DB 設定
メンバーシップの基礎
   認証と承認
    • アプリケーションイベントとしてリクエストの処
     理の初期に実行される
   認証
    • ユーザが誰かを確認する
     • ログイン後はログインチケットを元にユーザが確定され
         る
    • メンバーシップが有効になるのは Form 認証の設
     定が行われている場合
   承認
    • ページへのアクセス権を確認する
     • ユーザ/ロールに対して許可/拒否を設定
認証の設定
   デフォルト値( 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">
承認の設定
   設定例(未認証ユーザを拒否)
    <authorization>
       <deny users=“?” />
    </authorization>
   許可( allow )/拒否( deny )
   すべてのユーザ(” *” ) / 未認証ユーザ(” ?” )
   ロール名 / ユーザ名で個別に指定
   適用順序が記述順であることに注意
    •   allow と deny の組み合わせがある場合に注意
         <deny roles=“manager” />
         <allow roles=“Admins” />
      この設定を行った場合、 Admins と manager の双方に含まれるユーザは拒
     否されてしまう
   フォルダ/ファイル単位で設定可能
    •   フォルダ毎に web.config を置いて設定できる
    •   トップフォルダの web.config のみで設定を管理したい場合は Location 要素
        を利用する
メンバーシップの設定
   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 のプロパティに対応
メンバーシッププロバイダ
   ユーザの認証情報を保存/取得する
   プロバイダを置き換えることで様々なデータストアに対応
    • 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 もメンバーシッププロバイダを提供して
    いる
メンバーシップ用 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>
メンバーシップ DB の構築
   運用時には SQL Server 上に ASPNETDB
    を構築する
   既存のデータベース上に必要なテーブル
    、ストアドプロシージャを構築してもよ
    い
    • DB サーバに .NET Framework がインストール
        されていれば aspnet_regsql.exe を実行してウ
        ィザードで構築が可能
    •   テーブル等を生成する SQL スクリプトを作成
        してもよい
        • aspnet_regsql.exe –sqlexportonly   ファイル名 – A
         all
         –d データベース名
メンバーシップコントロール
   組み合わせて利用する
    •   Login              ー アカウントとパスワードによる認
        証
    •   CreateUserWizard   ー   ユーザの登録
    •   ChangePassword     -   パスワード変更
    •   PasswordRecovery   -   パスワードの再送
    •   LoginStatus        -   ログイン状態表示
    •   LoginName          -   ログイン名表示
    •   LoginView          -   ログイン状態に応じ表示内容を変
        更
   デザインのカスタマイズ
    •   オートフォーマットの適用
    •   各種プロパティによる変更
    •   テンプレートに変換すると細かい調整が可能
メンバーシップコントロールの表示
項目

   コントロールのプロパティと web.config
    の双方の調整が必要
   例: CreateUserWizard コントロールか
    らメールと質問項目を削除
    • コントロールの RequireEmail プロパティを
        False に
    •   SqlMembershipProvider の以下の設定を確認
        • requiresUniqueEmail         - False
        • requiresQuestionAndAnswer   - False
メンバーシップ利用時の注意点
   applicationName 要素の指定
    • デフォルト -  applicationName=“/”
    • Web アプリケーション毎に異なる値を指定す
        ることで 1 つの DB で複数の Web アプリケー
        ションのユーザを管理することが可能
    •   逆に同じ設定をすることで複数の Web アプリ
        ケーションで同一のユーザ情報を管理するこ
        とが可能
   サーバ上でユーザを管理する仕組みがな
    い
    • Web サイト管理ツールと同等の仕組みを実装
        する
    •   IIS7 では IIS の管理ツールに ASP.NET のユー
ロール
ロールの基礎
   ロールとは
    • ユーザをグループ単位で認証/承認する仕組
     み
   認証
    • ユーザをロールと関連付ける
    • ASP.NET による Windows 認証時、および
     Form 認証時にロールを有効にできる
   承認
    • ページへのアクセス権を確認する
ロールの設定
   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 からロールを取得
ロールの有効化
   利用するための設定
    •   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”);
ロールの利用
   フォルダ単位で 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 が設定されている必要がある
プロファイル
プロファイルの基礎
   プロファイルとは
    •   サイトに接続した利用者に関する任意の情報を保存/参照できる仕
        組み
    •   ログインとは関係なく利用することが可能
    •   IIS7 の管理ツールで管理が可能

   プロファイルの設定
    •   C:WindowsMicrosoft.NETFrameworkv2.0.50727CONFIGmachin
        e.config
         <profile>
            <providers>
                    <add name="AspNetSqlProfileProvider"
            connectionStringName="LocalSqlServer" applicationName="/"
            type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0,
            Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
            </providers>
         </profile>
実習 13
   Default.aspx
     •   テキストボックス、ボタンを追加
     •   Web サイト管理ツールを起動し、 ASPNETDB.MDF を追加(セキュリティタブクリックで追加)

   Default.aspx.cs
     protected void Page_Load(object sender, EventArgs e)
       {
         if (!IsPostBack)
             TextBox1.Text = Profile.MyData;
       }
       protected void Button1_Click(object sender, EventArgs e)
       {
         Profile.MyData = TextBox1.Text;
       }

   web.config
     <system.web>
       <anonymousIdentification enabled="true"/>
        <profile>
         <properties>
            <add name="MyData" serializeAs="String" allowAnonymous="true"/>
         </properties>
        </profile>
         </system.web>
プロファイルの活用
   匿名ユーザとして登録されたデータを認証ユーザ
    に受け渡すことも可能
    •   Global.asax で
          public void Profile_OnMigrateAnonymous(object sender,
             ProfileMigrateEventArgs args)
           {
               ProfileCommon anonymousProfile =
             Profile.GetProfile(args.AnonymousID);
               Profile.BloodType = anonymousProfile.BloodType;
           }

   永続化が可能
   Session オブジェクトの代替となりうる
    • 型付けされたデータとしてプログラム上で利用可能
    • データベース内では1つの項目に様々なデータが登録されてし
        まう点に注意が必要
コントロールカスタマイズ
実習 14
   Default.aspx
     •       CheckBoxList を追加し、アイテムを適当に追加

   App_Code/ListAdapter.cs
     using System.Web.UI;
     using System.Web.UI.WebControls;
     using System.Web.UI.WebControls.Adapters;

     public class ListAdapter:WebControlAdapter
     {
       protected override void Render(HtmlTextWriter writer)
       {
          ListControl targetControl = this.Control as ListControl;

             writer.WriteFullBeginTag("ul");

             IRepeatInfoUser repeaterInfo = (IRepeatInfoUser)this.Control;

             for (int i = 0; i < targetControl.Items.Count; i++)
             {
                writer.WriteFullBeginTag("li");
                repeaterInfo.RenderItem(ListItemType.Item, i, new RepeatInfo(), writer);
                writer.WriteEndTag("li");
             }
             writer.WriteEndTag("ul");
         }
     }
ControlAdapter の適用
   App_Browsers/All.browser
    <browsers>
      <browser refID="Default">
        <controlAdapters>
         <adapter
       controlType="System.Web.UI.WebControls.CheckBoxList"
       adapterType="ListAdapter" />
        </controlAdapters>
      </browser>
    </browsers>

   本来はブラウザの違いにより異なる HTML を生成させるた
    めの仕組み
    •   browser ファイルの設定で、ここではすべての場合に Adapter を適
        用するようにしている
    •   コントロールの Render を解析する必要があるが、一からカスタム
        コントロールを作成するよりは手軽
Web アプリケーションプロジェ
        クト
         と
  Web サイトプロジェクト
歴史的経緯
   VS2003 までは Web アプリケーションプロジェクト
    のみ
   VS2005 では Web サイトプロジェクトのみ
   VS2005 SP1 で Web アプリケーションプロジェクト
    が追加される
    •   VS2003 で作成したユーザコントロールが VS2005 にアップ
        グレードすると使えない、といった問題が発生していた
    •   細かくみると、 VS2003 までの Web アプリケーションプロ
        ジェクトと VS2005 SP1 以降のものは異なる点もある
        •   Default.aspx.designer.cs 等
    •   Web サイトプロジェクトの仕組みが ASP.NET 2.0 の元々の
        ベースであり、その上に Web アプリケーションプロジェク
        トを組み立てている
   VWD では 2005 、 2008 とも Web サイトプロジェク
    トのみ
    •   2008 SP1 で Web アプリケーションプロジェクトが追加
    •   ASP.NET MVC 、 Silverlight プロジェクト対応
何が違うのか?
   コンパイルのタイミング
    •   Web アプリケーションプロジェクト
        •   コードビハインドファイル、クラスファイル等のコードファイルをあらかじ
            めコンパイルし、その dll ファイルを bin フォルダに配置する必要がある(デ
            バッグ時のビルド)
        •   aspx ファイルのみ実行時にコンパイルされる
    •   Web サイトプロジェクト
      • すべてのファイルは実行時に一緒にコンパイルされる
      • デバッグ時のビルドではコンパイルエラーのチェックのみ行われる
   ファイル/フォルダ構成
    •   Web アプリケーションプロジェクト
        •   すべてのファイルを表示ボタンがある
             •   bin フォルダは通常非表示
        •   特定のフォルダ構成を必要としない
    •   Web サイトプロジェクト
        •   クラスファイルは App_Code フォルダに配置
        •   別に dll 化されたファイルを利用しない場合は bin フォルダは必要ない
こんな部分も違う
   言語の混在
    • Web アプリケーションプロジェクト
       • 不可
    • Web サイトプロジェクト
        •   可
        •   クラスファイルについてはフォルダを分け、 web.config の
            compilation/codeSubDirectories セクションにフォルダ名を追加する
   クラスのインテリセンス追加のタイミング
    • Web アプリケーションプロジェクト
       • ビルド後
    • Web サイトプロジェクト
      • ファイル保存後
   階層型マスターページ
    •   Web アプリケーションプロジェクト
        •   トップのマスターページ、階層下のマスターページ、コンテンツ用のページ
            のテンプレートがそれぞれ分かれている
    •   Web サイトプロジェクト
        •   マスターページや Web ページを追加するときに上位のマスターページを指
            定する
Web サイトプロジェクトにのみ必要な
機能
   プリコンパイル
    • aspnet_compiler.exe を利用して明示的に実行
    • Web サイトの発行によって自動的に実行
    • aspx ファイルを含め、すべてのファイルを dll
     化
      • aspx ファイルは中身のないファイルに
         • IIS の設定によってはファイルの存在が確認されるた
             め
         •   プリコンパイル時の設定で aspx ファイルを残すこと
             も可能
      • dll は bin フォルダに格納
      • 初期起動時のコンパイルが行われないため、起動が
        多少はやい
      • 配置先でソースの修正は不可に
             ソースの内容を見られることもない
ASP.NET TIPS
開発サーバのポート番号固定
   Web サービス等をテストする場合に便利
    • プロジェクトのプロパティで動的ポートの使
     用を false にする

   VS2005 では WebDev.WebServer.EXE
    をコマンドラインベースで利用する方法
    もある
    • WebDev.WebServer /port:8080 /path: 物理パ
     ス
web.config の暗号化
   セクション単位で暗号化が可能
   元々のファイルが置き換えられる
   暗号化してもプログラム中に変更はまっ
    たく必要ない

aspnet_regiis -pef “connectionStrings” web.config ファイルがあるフォルダ


   App.Config に対しても、一時的にファイ
    ル名を web.config に書き換えれば対応可
    能
    • 利用するマシンで暗号化を行う必要がある
App_Offline.htm
   この名前のファイルを置くと Web アプリ
    ケーションの動作が停止
   サイト内へのすべてのリクエストに対し
    て App_Offline.htm の内容が返される
   システム運用時の保守作業時等に有効
   512 バイト以上の内容がないと IE がファ
    イル無しと判断してしまうため、コメン
    ト行等でバイト数を稼ぐ必要がある

Más contenido relacionado

La actualidad más candente

Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 miso- soup3
 
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょJavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょKohki Nakashima
 
Hokuriku.NET ASP.NET MVC 入門 2 回目 1.編集機能を実装
Hokuriku.NET ASP.NET MVC 入門 2 回目 1.編集機能を実装Hokuriku.NET ASP.NET MVC 入門 2 回目 1.編集機能を実装
Hokuriku.NET ASP.NET MVC 入門 2 回目 1.編集機能を実装miso- soup3
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
Asp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソAsp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソYoshitaka Seo
 
ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築Masahiro Wakame
 
WkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたWkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたfirewood
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
Service workerとwebプッシュ通知
Service workerとwebプッシュ通知Service workerとwebプッシュ通知
Service workerとwebプッシュ通知zaru sakuraba
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-靖 小田島
 
Selenium 触ってみよう
Selenium 触ってみようSelenium 触ってみよう
Selenium 触ってみようOda Shinsuke
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編なべ
 
Chef windows linux環境構築
Chef windows linux環境構築Chef windows linux環境構築
Chef windows linux環境構築靖 小田島
 
Angular の紹介
Angular の紹介Angular の紹介
Angular の紹介Neo Xrea
 
Java on Microsoft Azure
Java on Microsoft AzureJava on Microsoft Azure
Java on Microsoft AzureYoshio Terada
 
Hakodate - simple framework
Hakodate - simple frameworkHakodate - simple framework
Hakodate - simple frameworkHiroaki Murayama
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方linzhixing
 

La actualidad más candente (20)

Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
 
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょJavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょ
 
Hokuriku.NET ASP.NET MVC 入門 2 回目 1.編集機能を実装
Hokuriku.NET ASP.NET MVC 入門 2 回目 1.編集機能を実装Hokuriku.NET ASP.NET MVC 入門 2 回目 1.編集機能を実装
Hokuriku.NET ASP.NET MVC 入門 2 回目 1.編集機能を実装
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
Asp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソAsp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソ
 
ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築ReVIEW & CI - ChefでCI環境構築
ReVIEW & CI - ChefでCI環境構築
 
WkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べたWkWebViewのキャッシュについて調べた
WkWebViewのキャッシュについて調べた
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
Service workerとwebプッシュ通知
Service workerとwebプッシュ通知Service workerとwebプッシュ通知
Service workerとwebプッシュ通知
 
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
AWSとAnsibleで実践!プロビジョニング入門‐Lamp+Laravel-
 
Selenium 触ってみよう
Selenium 触ってみようSelenium 触ってみよう
Selenium 触ってみよう
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編
 
Chef windows linux環境構築
Chef windows linux環境構築Chef windows linux環境構築
Chef windows linux環境構築
 
Angular の紹介
Angular の紹介Angular の紹介
Angular の紹介
 
Java on Microsoft Azure
Java on Microsoft AzureJava on Microsoft Azure
Java on Microsoft Azure
 
Spring と TDD
Spring と TDDSpring と TDD
Spring と TDD
 
Hakodate - simple framework
Hakodate - simple frameworkHakodate - simple framework
Hakodate - simple framework
 
REACT & WEB API
REACT & WEB APIREACT & WEB API
REACT & WEB API
 
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
Alfresco勉強会20120829: やさしいShareダッシュレットの作り方
 

Similar a 20080524

Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッションYuichi Hasegawa
 
HTML5でオフラインWebアプリケーションを作ろう
HTML5でオフラインWebアプリケーションを作ろうHTML5でオフラインWebアプリケーションを作ろう
HTML5でオフラインWebアプリケーションを作ろうyoshikawa_t
 
App012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をApp012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をTech Summit 2016
 
App012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をApp012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をTech Summit 2016
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説Akira Inoue
 
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」fukuoka.ex
 
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介david9142
 
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介Shotaro Suzuki
 
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますElixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますfukuoka.ex
 
[Microsoft Tech Summit] Linux/Java にも対応! Azure Service Fabric を使ったマイクロサービス開発
[Microsoft Tech Summit] Linux/Java にも対応! Azure Service Fabric を使ったマイクロサービス開発[Microsoft Tech Summit] Linux/Java にも対応! Azure Service Fabric を使ったマイクロサービス開発
[Microsoft Tech Summit] Linux/Java にも対応! Azure Service Fabric を使ったマイクロサービス開発Naoki (Neo) SATO
 
AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)Akio Katayama
 
20120416 aws meister-reloaded-aws-elasticbeanstalk-public
20120416 aws meister-reloaded-aws-elasticbeanstalk-public20120416 aws meister-reloaded-aws-elasticbeanstalk-public
20120416 aws meister-reloaded-aws-elasticbeanstalk-publicAmazon Web Services Japan
 

Similar a 20080524 (20)

20060419
2006041920060419
20060419
 
20050903
2005090320050903
20050903
 
Clrh 110716 wcfwf
Clrh 110716 wcfwfClrh 110716 wcfwf
Clrh 110716 wcfwf
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッション
 
20050917
2005091720050917
20050917
 
HTML5でオフラインWebアプリケーションを作ろう
HTML5でオフラインWebアプリケーションを作ろうHTML5でオフラインWebアプリケーションを作ろう
HTML5でオフラインWebアプリケーションを作ろう
 
App012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をApp012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_を
 
App012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_をApp012 linux java_にも対応!_azure_service_fabric_を
App012 linux java_にも対応!_azure_service_fabric_を
 
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
 
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
Elixir入門「第3回:Phoenix 1.3で高速webアプリ & REST APIアプリをサクッと書いてみる」
 
20061125
2006112520061125
20061125
 
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
 
Mobile Web
Mobile WebMobile Web
Mobile Web
 
JAWS-UG Meets Windows (JAWS Days 2017)
JAWS-UG Meets Windows (JAWS Days 2017)JAWS-UG Meets Windows (JAWS Days 2017)
JAWS-UG Meets Windows (JAWS Days 2017)
 
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips   Prism 4.5 & Kona project 等のご紹介
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
 
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますElixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
 
[Microsoft Tech Summit] Linux/Java にも対応! Azure Service Fabric を使ったマイクロサービス開発
[Microsoft Tech Summit] Linux/Java にも対応! Azure Service Fabric を使ったマイクロサービス開発[Microsoft Tech Summit] Linux/Java にも対応! Azure Service Fabric を使ったマイクロサービス開発
[Microsoft Tech Summit] Linux/Java にも対応! Azure Service Fabric を使ったマイクロサービス開発
 
20120609
2012060920120609
20120609
 
AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)AWSマイスターシリーズReloaded(AWS Beanstalk)
AWSマイスターシリーズReloaded(AWS Beanstalk)
 
20120416 aws meister-reloaded-aws-elasticbeanstalk-public
20120416 aws meister-reloaded-aws-elasticbeanstalk-public20120416 aws meister-reloaded-aws-elasticbeanstalk-public
20120416 aws meister-reloaded-aws-elasticbeanstalk-public
 

Más de 小野 修司 (20)

20140322
2014032220140322
20140322
 
20121215
2012121520121215
20121215
 
20120616
2012061620120616
20120616
 
20120425
2012042520120425
20120425
 
20120128
2012012820120128
20120128
 
20111203
2011120320111203
20111203
 
20110607
2011060720110607
20110607
 
20100313
2010031320100313
20100313
 
20100224
2010022420100224
20100224
 
20100218 lt
20100218 lt20100218 lt
20100218 lt
 
20100218
2010021820100218
20100218
 
20091207
2009120720091207
20091207
 
20090711
2009071120090711
20090711
 
20090606
2009060620090606
20090606
 
20090418
2009041820090418
20090418
 
20090212
2009021220090212
20090212
 
20080630
2008063020080630
20080630
 
20080627 2
20080627 220080627 2
20080627 2
 
20080627 1
20080627 120080627 1
20080627 1
 
20080213
2008021320080213
20080213
 

20080524

  • 1. 2 日で学ぶ ASP.NET の基礎 Visual Studio User Group Web アプリケーションフォーラムリーダー         小野 修司 (どっとねっと ふぁん)                        2008/5/24 - 25
  • 4. Web アプリケーションの特徴  「ブラウザ」と「サーバ」間のやりとり を繰り返して一連の処理を行う • ブラウザ • サーバにリクエストをあげる • サーバから受け取った HTML ( JavaScript を含む )を解釈してユーザインタフェースを表示する • サーバ • ブラウザから受け取ったリクエストに応じた処理を 行い、 HTML を組み立ててブラウザに返す • HTML というソースコードを生成している、と考え られる • 複数のブラウザからのリクエストを同時処理
  • 5. Web アプリケーションの構築/デバッグに必要な 知識  サーバ • Web サーバ、データベースサーバの設定/管 理  クライアント   • ブラウザによる実装の違い • HTML 、 CSS 、スクリプト  ネットワーク • TCP/IP 、 http  セキュリティ
  • 7. http 基礎  サーバへのリクエストがあって、はじめてレスポン スが返る • サーバから一方的にデータを送りつけることはできない  サーバはステート(前回のリクエスト状態等)を持 たない • ブラウザから次のリクエストが送られることを予期しない  利用されるメソッド • GET • ブラウザに URL を入力し、リターンキーを押したとき • 指定した URL に相当するページを返すようサーバに指示 • クエリ文字列を利用することで引数的にデータを渡せる • 文字数制限あり( IE 2,083 文字) • POST • 入力欄にデータを入力し、ボタン等を押したとき • 入力されたデータ等をサーバに渡す • 送信先ページは action で指定 • 文字数制限なし
  • 8. 実習 1 -準備  Index.htm (新しい項目で追加) <html> <body> <form method="post" action="Default.aspx"> <input id="Text1" type="text" name="Text1" /> <input id="Submit1" type="submit" value=" 送信 " /> </form> </body> </html>  Default.aspx • ラベル( Label1 )を追加  Default.aspx.cs protected void Page_Load(object sender, EventArgs e) { this.Label1.Text = Request.Form["Text1"]; }
  • 9. 実習 1  telnet による動作確認 telnet> open   localhost ポート番号 GET / プロジェクト名 /Index.htm HTTP/1.1 Host: localhost • HTML が返される  Trace による動作確認 • Default.aspx の Page ディレクティブ • Trace=“true” • 入力されたデータがリクエストに含まれる • 生成された HTML を確認
  • 10. 実習 1 での理解  http による通信は文字列のやりとりである • ブラウザとサーバで共通のデータを扱うためにはその データを文字列化してリクエスト/レスポンスに含め る必要がある  http による通信は必ずリクエストからはじまる  ブラウザは HTML を解釈して画面表示を行う • サーバは HTML というソースコードを生成する • サーバ上でできる処理(ソースコード生成-文字列組 み立て)とブラウザでできる処理(画面表示変更)を 区別した設計が必要  ASP.NET も http の上になりたっている
  • 12. ASP.NET の特徴  PostBack が基本 • form タグの action 先が自分自身 • ASP 等では action 先を別のページにし、データ入力ペー ジとデータ処理ページを分けるのが一般的だった • イベントドリブン型の開発のための仕掛け  コンパイルによる処理速度向上 • aspx ファイルはソースコード化されコンパイル • 最初の実行開始時に dll が作成される • ソースの修正等をしなければ dll はそのまま利用される • 実行時にメソッド単位で JIT コンパイルされるの は Windows アプリ等と同じ
  • 13. 実習 2 -準備  Default.aspx • Trace=“true” • テキストボックス、ボタン、ラベルを追加  Default.aspx.cs protected void Button1_Click(object sender, EventArgs e) { Label1.Text = TextBox1.Text; }
  • 14. 実習 2  初期表示時の要求の種類の確認  ソース/ HTML の確認 • form タグに注目  ボタンクリック後の要求の種類の確認  テンポラリーファイルの内容確認 • VISTA VS2008 • C:UsersUserNameAppDataLocalTempTemporary ASP.NET Files • VS2005 まで • C:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files • d ll、ソースコード( debug 時)、その他
  • 15. 実習 2 での理解  ASP.NET の基本は PostBack • runat=“server” が記されている form は Page に1つしか存在できず、必ず action が自分自 身になる からソースが自動生成され、コンパ  aspx イルが行われる
  • 17. 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 を指定する
  • 18. IIS6 上の Web アプリケーショ ン  フォルダをアプリケーションとして「設定 」する • 仮想ディレクトリでも実フォルダでも可能 • 標準で仮想ディレクトリを追加すると、アプリケ ーションとして設定済みとなる • 仮想ディレクトリはアプリケーションとして設定 せず、単に実ディレクトリ構成とは異なるフォル ダ階層を実現するためにも利用可能  アプリケーションの設定とは • Windows アプリケーションの1つの exe ファイル と個々のアプリケーション設定が対応するイメー ジ • アプリケーションの境界 • Framework のバージョン セキュリティ/アクセス制御
  • 19. IIS6 の認証と ASP.NET の認 証  IIS 側でも認証設定が可能 • 匿名 • 基本認証 • 統合 Windows 認証  ASP.NET にも認証機能がある • Form 認証 • DB ベース • Active Directory ベース • Windwos 認証  ASP.NET の認証機能を利用するほうが細かい設 定が容易 • IIS 側は匿名を許可しておく
  • 20. 開発サーバと IIS の違い  VS2005 以降には開発サーバが含まれており 、その上で動作検証が可能  開発サーバと IIS では動作が異なる • ファイルマッピング • 開発サーバ - すべてのファイルが ASP.NET によって処 理される • IIS - アプリケーションの構成で ASP.NET に関連づけ られた拡張子のファイルのみ ASP.NET によって処理さ れる • 開発サーバでは web.config によるアクセス制御が画像フ ァイル等にも影響する • 実行ユーザ • 開発サーバ - ログイン中のユーザの権限で実行される • IIS - ASPNET ユーザまたは Network Service ユーザの 権限で実行される • ファイルへの書き込み等を行っている場合に注意
  • 21. 実習 3  Default.aspx • ラベルを追加  Default.aspx.cs protected void Page_Load(object sender, EventArgs e) { Label1.Text = System.Security.Principal. WindowsIdentity.GetCurrent().Name; }  開発サーバと IIS で実行ユーザが異なることを確 認
  • 22. IIS7 と ASP.NET  ASP.NET を有効にすることで実行可能  IIS 7は ASP.NET をベースに進化したも のと考えてよい • ファイルはすべて ASP.NET によって処理され る • 実行ユーザは NT AUTHORITYNETWORK SERVICE • ASP.NET の設定と IIS7 の設定ツールが一体化 している • 一部 web.config の書き方が異なるので注意
  • 24. ASP.NET の設定  マシン全体の設定 • C:WindowsMicrosoft.NETFrameworkv2.0.50727CONFIG • machine.config • web.config • デフォルトの設定については config に記述されていないものも • 初期起動時の速度を早くするため、ハードコーディングされている • ドキュメントにて確認できるものもある  アプリケーション単位の設定 • アプリケーションとして設定されているフォルダに存在する web.config • 設定の種類によってはこの場所に記述しないと有効にならないもの がある • マシン全体の設定を引き継ぐ  下層のフォルダ単位の設定 • 各フォルダに存在する web.config • アプリケーション単位の web.config 内に含めることも可能 • 上位フォルダの設定を引き継ぐ
  • 25. 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 の参照と利用するコンパイラ の設定が追加される
  • 28. 概要  ブラウザからリクエストがあがる  http コンテキストが作られる  アプリケーションイベントが発生する • アプリケーションイベントの発生順序は固定 • ページの処理が行われる • ページイベントが発生する • ページイベントの発生順序は固定 • ポストバック時はコントロールイベント、ポストバック イベントが発生する  レスポンスが返される • ページ、 http コンテキストのインスタンスは破棄
  • 29. HttpContext  リクエストがあがってきてレスポンスを返すまで生存して いる • グローバル変数のような意味を持つインスタンスとなっている  以下のようなデータを格納 • リクエストの内容 • レスポンスの内容 • アプリケーションオブジェクト • セッションオブジェクト • キャッシュデータ • ユーザ情報  http コンテキストの内容を書き換えることで ASP.NET の 動作を変えることが可能 • 例: URL リライト • Context.Rewritepath  現在のコンテキストは HttpContext.Current で取得 • Page の中では Context プロパティで取得可能 • 独自クラスの中で HttpContext.Current を利用
  • 30. アプリケーションイベント  アプリケーションイベントの発生順序は固定  HttpApplication クラスのドキュメントで確認 BeginRequest リクエストの処理開始時に発生 AuthenticateRequest 認証の開始時に発生 PostAuthenticateRequest 認証の終了時に発生 AuthorizeRequest 承認の開始時に発生 PostAuthorizeRequest 承認の終了時に発生 ResolveRequestCache キャッシュの処理の開始時に発生 PostResolveRequestCache キャッシュの処理の終了時に発生 PostMapRequestHandler ハンドラの生成後に発生 AcquireRequestState セッション等の状態の取得時に発生 PostAcquireRequestState セッション等の状態の取得後に発生 PreRequestHandlerExecute ハンドラの実行前に発生 PostRequestHandlerExecute ハンドラの実行後に発生 ReleaseRequestState セッション等の状態の開放時に発生 PostReleaseRequestState セッション等の状態の開放後に発生 UpdateRequestCache キャッシュの状態更新時に発生 PostUpdateRequestCache キャッシュの状態更新後に発生 EndRequest リクエストの処理終了時に発生
  • 31. 実習 4 -準備  Global.asax   void Application_BeginRequest(object sender, EventArgs e) { string t = "test"; } void Application_AuthenticateRequest(object sender, EventArgs e) { string t = "test"; } void Application_PostMapRequestHandler(object sender, EventArgs e) { string t = "test"; }
  • 32. 実習 4  各イベント内にブレークポイントを設定  ウォッチウィンドウで HttpContext.Current のプロパティの状態 を確認 • User • Handler
  • 33. 実習 4 での理解  アプリケーションイベントを通り抜けて いくことで HttpContext が変化していく ことを確認する  ウォッチウィンドウでインスタンスの状 態を確認する方法を理解する
  • 34. HttpModule  アプリケーションイベントをトリガにし て実行する処理をまとめて登録するしく み  IHttpModule インタフェースを継承した クラスで最低限 Init メソッドと Dispose メソッドを実装する • Init メソッド-アプリケーションイベントにプ ライベートメソッドを登録する • Dispose メソッド-通常は空でよい  作成したクラスを web.config で登録する
  • 35. 実習 5 -準備  App_Code/TestModule.cs public class TestModule : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_BeginRequest); context.EndRequest += new EventHandler(context_EndRequest); } public void Dispose() { }    void context_BeginRequest(object sender, EventArgs e) { HttpContext.Current.Items["startTime"] = DateTime.Now; }    void context_EndRequest(object sender, EventArgs e) { HttpContext.Current.Response.Write(       DateTime.Now.Subtract((DateTime)HttpContext.Current.Items["startTime"]).Milliseconds.ToString() ); } }
  • 36. 実習 5  web.config <httpModules> <add name=“TestModule”   type="TestModule"/ > </httpModules>  ページ最下段に処理にかかった時間数( ミリ秒)が表示される  web.config の設定を消すと時間数は表示 されない
  • 37. 実習 5 での理解  すべてのリクエストに対する処理を HttpModule で登録することができる  web.config の設定で簡単に処理の組み込 みが可能
  • 38. 実装済の 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 で実装されている
  • 39. HttpModule の利用例  URL リライト • http://localhost/id/1/default.aspx ← ブラウザからのリクエ スト • http://localhost/default.aspx?id=1 ← 内部処理でのリクエス ト • DotNetNuke 等で実装 • SEO 対策、検索エンジン対策 • .NET Framework 3.5 SP1 で ASP.NET ルーティングが提供 され必要性は減少する  IIS7 ではマッピングに制限されずすべてのリクエス トに対して HttpModule を適用できるようになるため 、利用を考慮する機会は増える
  • 42. 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 に制御が渡されていることが前提
  • 43. ashx ファイル  もっともシンプルな IHttpHandler 実装 • IsReusable メソッド • false を返す • ProcessRequest • 処理を記述 • Context.Response にブラウザに返したいデータを 書き込む
  • 44. 実習 6-1  test.ashx ファイルを追加 • サンプルコードが記述されている  実行して生成されるソース HTML を確認 • ashx ファイルでは書き込んだデータしか表示 されない
  • 45. ashx の利用例  画像ファイルや文書ファイルのダウンロ ード時に ASP.NET の処理を追加したい 場合 • ダウンロード回数のカウント • 認証済みユーザにのみダウンロードを許可  出力する内容を完全にコントロールでき る • aspx ファイルを利用すると、意図しない出力 が追加される場合も
  • 46. 実習 6-2 -準備  test.aspx ファイルを App_Code 下に移動 し、拡張子を .cs に変更する  WebHandler ディレクティブを削除する  web.config に追加 <httpHandlers> <add verb="*" path ="*.myx" type="test"/> </httpHandlers>
  • 47. 実習 6-2  ブラウザから test.myx 、 hello.myx 等、 適当な名前の .myx ファイルにアクセスす る  どの場合でも「 Hello World 」が返され ることを確認する
  • 48. HttpHandler の利用例  静的表示の多いサイトでコンテンツと表現 を分離して管理する • コンテンツの内容を XML で作成 • Handler 内で XML に XSLT を適用し、 HTML を生 成 • XSLT の変更で生成される HTML は自由に変更可 能 • マイクロソフトサイトの mspx  IIS6 上で利用するには拡張子のマッピング が必要 • IIS7 ではマッピングは必要ない
  • 49. aspx ファイル  System.Web.UI.Page クラスを継承 • IHttpHandler インターフェイスを継承している  内部に多くのコントロールを持つ • 通常ツールボックスからのドラッグ アンド ドロップで 追加  ページライフサイクル • ページのインスタンスはリクエスト毎に生成され消滅 する • 初期表示時のインスタンスとポストバック時のインスタンス に関連は存在しない(ステートレス) • ページが生成して消滅するまでにページイベントが決 まった順番で発生する
  • 50. 実習 7-1  Default.aspx • Trace=“true” • テキストボックス、ボタン、ラベルを追加  Default.aspx.cs protected void Button1_Click(object sender, EventArgs e) { Label1.Text = TextBox1.Text; }
  • 51. コントロールのツリー  _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 終了タグ  ソースコードで対応を確認
  • 52. コントロールツリー  aspx 内のすべての要素がコントロール化 され Page クラスを根とするツリー構造 内で管理される • 文字列 →  LiteralControl • ツリーの階層構造 = タグの階層構造
  • 53. コントロールの種類  HTML コントロール • HTML ツールボックスからドラッグ アンド ドロップ • コントロールツリーでは LiteralControl となり、サーバ上のプログラムで制 御できない • 記述した内容そのままが HTML となる  HTML サーバコントロール • HTML コントロールに runat=“server” を追加 • サーバ上のプログラムで制御可能 • 記述した内容がほぼそのまま HTML となる  Web コントロール • 標準ツールボックスからドラッグ アンド ドロップ • サーバ上のプログラムで制御可能 • プロパティの状態によって生成される HTML が変わる • TextBox の TextMode ( SingleLine 、 Password 、 MultiLine ) • ViewState を利用し、ポストバック前後の自分の状態を保持する • カレンダー、データグリッドのように内部的にコントロールを持つ複合コン トロールも存在する
  • 54. ページイベント  初期表示時  ポストバック時 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
  • 55. ページイベントによる処理  初期化  コントロールツリーの作成  リクエスト読み込み • ポストバック時のみ • ビューステート、ポストデータを各コントロールに割り当て  コントロールイベント • ポストバック時のみ • ビューステートとポストデータの違いからコントロールイベントが 発生  ポストバックイベント • ポストバック時のみ • ポストバックの原因となったイベントが発生  レンダリング • 各コントロールがプロパティの状態を元に自分自身を HTML 化し、 レスポンスに追加
  • 56. AutoEventWireup  ASP.NET 2.0 以降はデフォルトで true  下記のメソッド呼び出しがハードコーディングされており、該当するメソ ッドを作成しておけば自動的に呼び出される 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  これ以外のイベント発生時のメソッド呼び出しは初期化時に登録を行う必 要がある
  • 57. 実習 7-2 -準備  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"); }
  • 58. 実習 7-2  下記の状態でトレースを確認 • 初期表示 • テキストボックスに「 Hello 」と入力し、ボタンをクリック • テキストボックスを変更せず、ボタンをクリック • テキストボックスを「 Hello World 」に変更し、 Enter キー を入力 • テキストボックスを「 Hello 」に変更し、 Enter キーを入力  確認内容 • Page_Load は常に実行される • テキストボックスにはポストバック前のデータが表示される • ビューステートに含まれている • TextChanged はポストバック時に実行される • ビューステートの内容とフォームコレクションの値が異なるとき • ボタンをクリックしないと Button1_Click イベントは発生し ない • フォームコレクションに Button1 が表示されていない
  • 59. 実習 7-3  Default.aspx <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True" ontextchanged="TextBox1_TextChanged"> </asp:TextBox>  確認内容 • 生成される HTML ソースに JavaScript の記述とそ の呼び出し部分が追加されている • テキストボックスの内容を変更し、カーソルを移 動するとポストバックが発生する • ポストバック時、 TextChanged が実行される
  • 60. たまにある質問  その1 • Response.Write で書き込んだ内容がページの 先頭に書き込まれます  その2 • DropDownList にデータバインディングでデー タを表示しています。 Page_Load で初期表示 値を設定したいんですができません
  • 61. 実習 8 -準備  Default.aspx • ラベルを追加  Default.aspx.cs   protected void Page_Load(object sender, EventArgs e) { Label1.Text = " ロード時に設定 "; Response.Write("Page_Load"); } protected void Page_PreRender(object sender, EventArgs e) { Response.Write("Page_PreRender"); } protected void Page_SaveSateComplete(object sender, EventArgs e) { Response.Write("Page_SaveStateComplete"); }
  • 62. 実習 8 での理解  Response.Write とページを含むコントロー ルの HTML 生成/書き込みタイミングが異 なる • Response.Write は呼び出されたタイミングで渡さ れたデータを httpContext が持つ Response に書き 込む • Page およびそれに含まれるコントロールは Render のタイミングで自分自身を HTML 化 し、 httpContext が持つ Response に書き込む • Render 終了後は Response.Write でデータを書き 込むことはできない  結論: Response.Write は Page の中では使 わない
  • 63. 実習 9 -準備  id と dataName 項目を持つテーブルとデータを準備  Default.aspx • Trace=“true” • DropDownList を追加し、 SqlDataSource でバインディング  Default.aspx.cs   protected void Page_Load(object sender, EventArgs e) { DropDownList1.SelectedValue = "3"; } protected void DropDownList1_DataBound(object sender, EventArgs e) { Trace.Warn("DataBound"); }
  • 64. 実習 9  Page_Load 内で DropDownList.DataBind() を実行すると DataBound のタイミングが変わることを 確認する • デフォルトの実行は PreRender  .NET Framework 3.5 ( SP1? )でこの問 題への対処が行われていると思われる • それ以前のバージョンではデータのバインデ ィング後でなければ SelectedValue 等が動か なかった
  • 65. ASP.NET でのプログラミング作業 とは  Web アプリでのサーバの作業は HTML (文字列 )を組み立てること  ASP.NET では各種コントロールを導入すること で直接文字列を組み立てることはなくなっている • どのような HTML を生成するかは個々のコントロール の責任 • コントロールはプロパティの値を元にそれに合わせた HTML を生成する • Render のタイミングまでにコントロールのプロパティ を適切に操作する作業が ASP.NET でのプログラミング 作業 • ページイベントを理解し、プロパティの操作に適切な タイミングを選択する必要がある
  • 68. ページ遷移  ASP.NET の基本は PostBack であるため form タグによるページ遷移は難しい • HTML コントロールとしての form タグは利用 可能だが、 Web コントロールと組み合わせる と使い方が難しい  通常利用されるページ遷移の方法 • リンク • リダイレクト • トランスファー • 別ページポストバック
  • 69. リンク  ユーザのクリックにより指定先の URL を 表示 • リンク先が異なる Web アプリケーションでも 遷移が可能 • ASP.NET のサイトに限らない • GET メソッドを利用した遷移 • クエリ文字列を利用したデータの引渡しは可能 • URL の長さに制限あり
  • 70. リダイレクト  サーバの処理中にリダイレクトを記述する • 実際にはブラウザに対して指定した URL に GET メソッドを発行するよう指示するレスポン スが送られる • ブラウザとのやりとりが発生する • リンク先やリンク元が異なる Web アプリケー ションでも遷移が可能 • ASP.NET のサイトに限らない • GET メソッドを利用した遷移 • クエリ文字列を利用したデータの引渡しは可能 • URL の長さに制限あり
  • 71. トランスファー  サーバの処理中にトランスファーを記述す る • 実際には指定したページのインスタンスが生成さ れ、そのページの処理が開始される • トランスファーの遷移先は同一の Web アプリケー ション内に限定される • 1つのリクエストの処理の中で実行されるページ のインスタンスが置き換わるため、ブラウザの URL は遷移前のまま変わらない • 1 つのリクエストの処理の中で実行されるページ が置き換わるため、ページの認証、承認といった アプリケーションイベントは遷移前のページに対 して行われ、遷移後のページに対しては実行され ない 一般的には使わない
  • 73. 別ページポストバック  ボタン、リンクボタン、イメージボタン の PostBackUrl オプションに遷移先を設 定する  ボタンクリックにより指定した遷移先が 呼び出される • POST メソッドを利用した呼び出しが行われ る • JavaScript を利用して form のポスト先を書き 換えている • 遷移した先が同一 Web アプリケーションであ れば PreviousPageType ディレクティブを設 定して遷移元で公開しているプロパティの値 を取得可能
  • 74. 実習 10 -準備  Default.aspx • テキストボックス、ボタンを追加 • ボタンの PostBackUrl プロパティに Default2.aspx を設定  Default.aspx.cs   public string MyText { get { return TextBox1.Text; } }  Default2.aspx • Trace=“true” • <%@ PreviousPageType VirtualPath="~/Default.aspx" %> • ラベルを追加  Default2.aspx.cs   protected void Page_Load(object sender, EventArgs e) { Label1.Text = PreviousPage.MyText; }
  • 75. 実習 10  Default.aspx でテキストボックスに何か 入力してボタンをクリック  Default2.aspx に遷移することを確認  Default2.aspx でブレークポイントを設定 し、 PreviousPage の型を確認  Default2.aspx のメソッド、フォームコレ クションを確認
  • 76. 実習 10 での理解  別ページポストバックで利用する JavaScript は WebResource.axd を介してダ ウンロードされる • JavaScript によって form の action が書き換えられ る • form のメソッドは post のまま  POST には POST データ、 ViewState が含 まれる • PreviousPageType で指定されたページのインスタ ンスを生成し、そこに ViewState を読み込ませる ことにより Public なプロパティを取り出せるもの と思われる
  • 78. ステート保持  Web アプリケーションの基本はステート レス • ページの遷移時だけでなく、ポストバック時 も以前の状態を保持できない  アプリケーションとして一連の処理を実 行するためには様々な長さでステートを 保持できる必要がある • ポストバック間 • ページ遷移間 • ユーザが処理を行っている間 • アプリケーションが起動している間
  • 79. ポストバック間でのステート保 持  ViewState • Web コントロールはデフォルトで ViewState を利 用する • ページ単位、コントロール単位で制御可能 • プログラムから独自に利用することも可能 • 格納できるのはシリアライズ可能なオブジェクト • 取得時に型を設定する必要がある • データ量に注意する必要がある • DataGrid 等と SqlDataSource を組み合わせてページング /ソーティングを行っている場合、表示されるデータは 該当するページ内のものだが、 ViewState には抽出され たすべてのデータが含まれる • 通信量の増大が体感実行速度に影響
  • 80. ページ遷移間でのステート保持  ページ遷移の方法によって利用できるもの が異なる • リンク:クエリ文字列 • リダイレクト:クエリ文字列 • トランスファー:クエリ文字 列、 HttpContext.Items • ページ間ポストバック: POST デー タ、 ViewState  HttpContext.Items • IDictionary 型- key を設定して object を格納でき る • HttpContext はリクエストの処理の間を通じて存在 しており、トランスファー実行時のページ間での データの受け渡しが可能
  • 81. ユーザが処理を行っている間でのステート 保持  クッキー • ブラウザ側で値を保持 • リクエスト時に毎回ブラウザからサーバに送られる • 有効期間を設定可能 • ブラウザを閉じても存続させることが可能 • 格納できる長さに制限あり • ブラウザの設定によっては利用不可  セッションオブジェクト • デフォルトではセッションの判定(セッションキーを保持している)にクッ キーを利用 • デフォルトではサーバ上のメモリにデータを格納する • 格納できるデータはシリアライズ可能なもの • セッションキーを保持しているブラウザから一定期間アクセスがない場合に データは破棄される • http はブラウザからのリクエストではじめて処理が開始されるので、サーバ側で はリクエストを待っているしかない • Web.config で一定期間の設定を変更可能
  • 82. セッション利用の設定変更  クッキーレス <system.web> <sessionState cookieless="UseUri"/> </system.web> • 携帯等クッキーを利用できないブラウザを想定する場合に設定 • セッションキーが URL に埋め込まれる  データの保存場所 <system.web> <sessionState mode=“InProc"/> </system.web> • InProc • サーバ上のメモリ内に格納される • Session_OnEnd が発生するのはこの状態のみ • StateServer • 複数台のサーバがある場合、その中の一台のメモリ上に格納される • セッションを格納するサーバで StateServer のサービスを起動する必要がある • SQLServer • データベース上に格納される • aspnet_regsql.exe ツールを利用してセッション状態を保持するデータベースをインストールす る • セッションデータはアクセスがない状態で一定時間が経過したタイミングで削除される
  • 83. アプリケーションが起動している間でのステート 保持  アプリケーションオブジェクト • 格納できるデータはシリアライズ可能なもの • 書き込み時には競合に注意 • Application.Lock ()、 Application.UnLock() を利用する • Lock 、 UnLock はファイル書き込み等の排他制御に利用 することも可能 • 処理速度を低下させる場合もあるので利用には注意 • Web アプリケーションは一定時間リクエストをま ったく受け取らなかった場合に終了することに注 意 • http はブラウザからのリクエストではじめて処理が開始 されるので、サーバ側ではリクエストを待っているしか ない • Web.config で一定期間の設定を変更可能 • 次にリクエストを受け取ったときに起動が行われる
  • 85. キャッシュの種類  データキャッシュ • Cache オブジェクトにオブジェクトを追加する • Cache オブジェクトはアプリケーション全体で利 用可能  ページの部分キャッシュ • ユーザコントロールを作成し、 outputcache ディ レクティブを設定する  ページキャッシュの部分更新 • Substitution コントロールを利用する  ページキャッシュ • ページに outputcache ディレクティブを設定する • クエリ文字列毎にキャッシュを持つことが可能
  • 86. キャッシュの生存期間  キャッシュの設定時に期間を指定 • データキャッシュ • 時間指定 • 依存関係指定 • ファイル、ディレクトリ、他のデータキャッシュ等 • キャッシュの項目削除時に通知を受けることも可能 • この機能を利用して、定期的な処理を組み込むこともで きる • ページキャッシュ • 時間指定 • SQL Server の特定テーブルの変更に依存させることも可 能 • aspnet_regsql.exe で設定 • キャッシュの配置位置をクライアント/サーバ/両方に 指定することも可能
  • 87. キャッシュの利用にあたって  どこの負荷を下げたいのかを考慮する • データベース/ Web サーバ/ネットワーク  表示の変更タイミングを考慮する • データの変更頻度 • ユーザ毎に異なる表示が必要か?  調整は必要
  • 89. 実習 11 -準備  Default.aspx • テキストボックス、ボタン、ラベルを追加  Default.aspx.cs   protected void Button1_Click(object sender, EventArgs e) { Label1.Text = TextBox1.Text; }  動作を確認後 Default.aspx に以下を追加 • ScriptManager • UpdatePanel • テキストボックス、ボタン、ラベルを UpdatePanel 内に移動
  • 90. 実習 11 での理解  HTML ソースに WebResource.axd 、 ScriptResource.axd が 追加されている • ダウンロードされる js ファイルを VS2008 から確 認可能 • MicrosoftAjax.js • MicrosoftAjaxWebForm.js  HTML の form 、 input type=“submit” 等が変 更されているわけではない • Submit は MicrosoftAjaxWebForms.js の _onFromSubmit に置き換えられる • Sys$WebForms$PageRequestManager$_onFormSubmit
  • 91. 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 は便利だが、それに限定されるもの ではない
  • 93. 実習 12  Default.aspx • LoginStatus • LoginName • ChangePassword  Loain.aspx • Login • CreateUserWizard  Web サイト管理ツール • 認証の種類 - インターネットから • アクセス規則の作成 -トップディレクトリで匿 名ユーザを拒否
  • 94. 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 )は自動的に生成 される  サーバ上の Web サイト管理ツールを外部から利用す ることはできない
  • 95. メンバーシップを理解するには  様々な設定を理解する必要がある • 認証設定 • 承認設定 • メンバーシップ設定 • メンバーシップ用 DB 設定
  • 96. メンバーシップの基礎  認証と承認 • アプリケーションイベントとしてリクエストの処 理の初期に実行される  認証 • ユーザが誰かを確認する • ログイン後はログインチケットを元にユーザが確定され る • メンバーシップが有効になるのは Form 認証の設 定が行われている場合  承認 • ページへのアクセス権を確認する • ユーザ/ロールに対して許可/拒否を設定
  • 97. 認証の設定  デフォルト値( 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">
  • 98. 承認の設定  設定例(未認証ユーザを拒否) <authorization> <deny users=“?” /> </authorization>  許可( allow )/拒否( deny )  すべてのユーザ(” *” ) / 未認証ユーザ(” ?” )  ロール名 / ユーザ名で個別に指定  適用順序が記述順であることに注意 • allow と deny の組み合わせがある場合に注意 <deny roles=“manager” /> <allow roles=“Admins” />   この設定を行った場合、 Admins と manager の双方に含まれるユーザは拒 否されてしまう  フォルダ/ファイル単位で設定可能 • フォルダ毎に web.config を置いて設定できる • トップフォルダの web.config のみで設定を管理したい場合は Location 要素 を利用する
  • 99. メンバーシップの設定  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 のプロパティに対応
  • 100. メンバーシッププロバイダ  ユーザの認証情報を保存/取得する  プロバイダを置き換えることで様々なデータストアに対応 • 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 もメンバーシッププロバイダを提供して いる
  • 101. メンバーシップ用 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>
  • 102. メンバーシップ DB の構築  運用時には SQL Server 上に ASPNETDB を構築する  既存のデータベース上に必要なテーブル 、ストアドプロシージャを構築してもよ い • DB サーバに .NET Framework がインストール されていれば aspnet_regsql.exe を実行してウ ィザードで構築が可能 • テーブル等を生成する SQL スクリプトを作成 してもよい • aspnet_regsql.exe –sqlexportonly ファイル名 – A all –d データベース名
  • 103. メンバーシップコントロール  組み合わせて利用する • Login ー アカウントとパスワードによる認 証 • CreateUserWizard ー ユーザの登録 • ChangePassword - パスワード変更 • PasswordRecovery - パスワードの再送 • LoginStatus - ログイン状態表示 • LoginName - ログイン名表示 • LoginView - ログイン状態に応じ表示内容を変 更  デザインのカスタマイズ • オートフォーマットの適用 • 各種プロパティによる変更 • テンプレートに変換すると細かい調整が可能
  • 104. メンバーシップコントロールの表示 項目  コントロールのプロパティと web.config の双方の調整が必要  例: CreateUserWizard コントロールか らメールと質問項目を削除 • コントロールの RequireEmail プロパティを False に • SqlMembershipProvider の以下の設定を確認 • requiresUniqueEmail - False • requiresQuestionAndAnswer - False
  • 105. メンバーシップ利用時の注意点  applicationName 要素の指定 • デフォルト -  applicationName=“/” • Web アプリケーション毎に異なる値を指定す ることで 1 つの DB で複数の Web アプリケー ションのユーザを管理することが可能 • 逆に同じ設定をすることで複数の Web アプリ ケーションで同一のユーザ情報を管理するこ とが可能  サーバ上でユーザを管理する仕組みがな い • Web サイト管理ツールと同等の仕組みを実装 する • IIS7 では IIS の管理ツールに ASP.NET のユー
  • 107. ロールの基礎  ロールとは • ユーザをグループ単位で認証/承認する仕組 み  認証 • ユーザをロールと関連付ける • ASP.NET による Windows 認証時、および Form 認証時にロールを有効にできる  承認 • ページへのアクセス権を確認する
  • 108. ロールの設定  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 からロールを取得
  • 109. ロールの有効化  利用するための設定 • 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”);
  • 110. ロールの利用  フォルダ単位で 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 が設定されている必要がある
  • 112. プロファイルの基礎  プロファイルとは • サイトに接続した利用者に関する任意の情報を保存/参照できる仕 組み • ログインとは関係なく利用することが可能 • IIS7 の管理ツールで管理が可能  プロファイルの設定 • C:WindowsMicrosoft.NETFrameworkv2.0.50727CONFIGmachin e.config <profile> <providers> <add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> </providers> </profile>
  • 113. 実習 13  Default.aspx • テキストボックス、ボタンを追加 • Web サイト管理ツールを起動し、 ASPNETDB.MDF を追加(セキュリティタブクリックで追加)  Default.aspx.cs protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) TextBox1.Text = Profile.MyData; } protected void Button1_Click(object sender, EventArgs e) { Profile.MyData = TextBox1.Text; }  web.config <system.web> <anonymousIdentification enabled="true"/>    <profile> <properties>    <add name="MyData" serializeAs="String" allowAnonymous="true"/> </properties>    </profile> </system.web>
  • 114. プロファイルの活用  匿名ユーザとして登録されたデータを認証ユーザ に受け渡すことも可能 • Global.asax で public void Profile_OnMigrateAnonymous(object sender, ProfileMigrateEventArgs args) { ProfileCommon anonymousProfile = Profile.GetProfile(args.AnonymousID); Profile.BloodType = anonymousProfile.BloodType; }  永続化が可能  Session オブジェクトの代替となりうる • 型付けされたデータとしてプログラム上で利用可能 • データベース内では1つの項目に様々なデータが登録されてし まう点に注意が必要
  • 116. 実習 14  Default.aspx • CheckBoxList を追加し、アイテムを適当に追加  App_Code/ListAdapter.cs using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.Adapters; public class ListAdapter:WebControlAdapter { protected override void Render(HtmlTextWriter writer) { ListControl targetControl = this.Control as ListControl; writer.WriteFullBeginTag("ul"); IRepeatInfoUser repeaterInfo = (IRepeatInfoUser)this.Control; for (int i = 0; i < targetControl.Items.Count; i++) { writer.WriteFullBeginTag("li"); repeaterInfo.RenderItem(ListItemType.Item, i, new RepeatInfo(), writer); writer.WriteEndTag("li"); } writer.WriteEndTag("ul"); } }
  • 117. ControlAdapter の適用  App_Browsers/All.browser <browsers> <browser refID="Default"> <controlAdapters> <adapter controlType="System.Web.UI.WebControls.CheckBoxList" adapterType="ListAdapter" /> </controlAdapters> </browser> </browsers>  本来はブラウザの違いにより異なる HTML を生成させるた めの仕組み • browser ファイルの設定で、ここではすべての場合に Adapter を適 用するようにしている • コントロールの Render を解析する必要があるが、一からカスタム コントロールを作成するよりは手軽
  • 118. Web アプリケーションプロジェ クト と Web サイトプロジェクト
  • 119. 歴史的経緯  VS2003 までは Web アプリケーションプロジェクト のみ  VS2005 では Web サイトプロジェクトのみ  VS2005 SP1 で Web アプリケーションプロジェクト が追加される • VS2003 で作成したユーザコントロールが VS2005 にアップ グレードすると使えない、といった問題が発生していた • 細かくみると、 VS2003 までの Web アプリケーションプロ ジェクトと VS2005 SP1 以降のものは異なる点もある • Default.aspx.designer.cs 等 • Web サイトプロジェクトの仕組みが ASP.NET 2.0 の元々の ベースであり、その上に Web アプリケーションプロジェク トを組み立てている  VWD では 2005 、 2008 とも Web サイトプロジェク トのみ • 2008 SP1 で Web アプリケーションプロジェクトが追加 • ASP.NET MVC 、 Silverlight プロジェクト対応
  • 120. 何が違うのか?  コンパイルのタイミング • Web アプリケーションプロジェクト • コードビハインドファイル、クラスファイル等のコードファイルをあらかじ めコンパイルし、その dll ファイルを bin フォルダに配置する必要がある(デ バッグ時のビルド) • aspx ファイルのみ実行時にコンパイルされる • Web サイトプロジェクト • すべてのファイルは実行時に一緒にコンパイルされる • デバッグ時のビルドではコンパイルエラーのチェックのみ行われる  ファイル/フォルダ構成 • Web アプリケーションプロジェクト • すべてのファイルを表示ボタンがある • bin フォルダは通常非表示 • 特定のフォルダ構成を必要としない • Web サイトプロジェクト • クラスファイルは App_Code フォルダに配置 • 別に dll 化されたファイルを利用しない場合は bin フォルダは必要ない
  • 121. こんな部分も違う  言語の混在 • Web アプリケーションプロジェクト • 不可 • Web サイトプロジェクト • 可 • クラスファイルについてはフォルダを分け、 web.config の compilation/codeSubDirectories セクションにフォルダ名を追加する  クラスのインテリセンス追加のタイミング • Web アプリケーションプロジェクト • ビルド後 • Web サイトプロジェクト • ファイル保存後  階層型マスターページ • Web アプリケーションプロジェクト • トップのマスターページ、階層下のマスターページ、コンテンツ用のページ のテンプレートがそれぞれ分かれている • Web サイトプロジェクト • マスターページや Web ページを追加するときに上位のマスターページを指 定する
  • 122. Web サイトプロジェクトにのみ必要な 機能  プリコンパイル • aspnet_compiler.exe を利用して明示的に実行 • Web サイトの発行によって自動的に実行 • aspx ファイルを含め、すべてのファイルを dll 化 • aspx ファイルは中身のないファイルに • IIS の設定によってはファイルの存在が確認されるた め • プリコンパイル時の設定で aspx ファイルを残すこと も可能 • dll は bin フォルダに格納 • 初期起動時のコンパイルが行われないため、起動が 多少はやい • 配置先でソースの修正は不可に ソースの内容を見られることもない
  • 124. 開発サーバのポート番号固定  Web サービス等をテストする場合に便利 • プロジェクトのプロパティで動的ポートの使 用を false にする  VS2005 では WebDev.WebServer.EXE をコマンドラインベースで利用する方法 もある • WebDev.WebServer /port:8080 /path: 物理パ ス
  • 125. web.config の暗号化  セクション単位で暗号化が可能  元々のファイルが置き換えられる  暗号化してもプログラム中に変更はまっ たく必要ない aspnet_regiis -pef “connectionStrings” web.config ファイルがあるフォルダ  App.Config に対しても、一時的にファイ ル名を web.config に書き換えれば対応可 能 • 利用するマシンで暗号化を行う必要がある
  • 126. App_Offline.htm  この名前のファイルを置くと Web アプリ ケーションの動作が停止  サイト内へのすべてのリクエストに対し て App_Offline.htm の内容が返される  システム運用時の保守作業時等に有効  512 バイト以上の内容がないと IE がファ イル無しと判断してしまうため、コメン ト行等でバイト数を稼ぐ必要がある

Notas del editor

  1. ※ 推奨印刷設定 A4 ・カラー印刷 ・ 配布資料・ 2 スライド / ページ ・ スライドに枠をつけない