チュートリアル : Web ページ エラーの検索に役立つ Visual Web Developer でのトレースの使用
更新 : 2007 年 11 月
ASP.NET Web ページのエラーを検索するには、複数の方法があります。これには、デバッガやトレースの使用が含まれます。トレースでは、ページ処理中に発生したアクションに関するメッセージが表示され、表示するように選択した情報を含めることもできます。トレースでは、サーバーとブラウザで交換されているデータに関する情報も表示できます。データ交換には、コントロールの詳細、サーバー変数、ユーザー名、Cookie などがあります。このチュートリアルでは、トレースの使用方法について説明します。
トレースは、デバッガの使用が実際的ではない、または適切ではない場合に便利です。たとえば、ページがリモート サーバー上にあるため、デバッガを使用できない場合があります。トレースにより、デバッガで明示的に使用できない HTTP ヘッダーなどの情報を表示するのも簡単になります。デバッグの詳細については、「チュートリアル : Visual Web Developer での Web ページのデバッグ」を参照してください。
このチュートリアルでは、トレースを使用します。ユーザーに名前の入力を求め、その名前を表示する Web ページを作成します。ユーザーが名前を再入力する必要がないように、ページに Cookie で名前が保存されます。
メモ : |
---|
実際のアプリケーションでは、個人情報の保存には、ASP.NET プロファイル プロパティを使用する方が適しています。詳細については、「ASP.NET プロファイル プロパティの概要」を参照してください。ただし、このチュートリアルでは Cookie の使用によりコードが簡略化されるため、トレースに重点を置くことができます。 |
このチュートリアルでは、意図的にいくつかのエラーを発生させます。次に、トレースを使用してページ処理のステータスを確認し、エラーを診断できるようにします。
このチュートリアルでは、以下のタスクを行います。
単一のページのトレースの有効化
トレース出力の読み取り
カスタム トレース情報の表示
個別のトレース ウィンドウでのトレース情報の表示
カスタム トレース出力の作成
前提条件
このチュートリアルを完了させるための要件を次に示します。
Microsoft Visual Web Developer Web 開発ツール
.NET Framework
このチュートリアルは、Visual Web Developer の操作法に関する一般的な知識があることを前提としています。Visual Web Developer の概要については、「チュートリアル : Visual Web Developer での基本的な Web ページの作成」を参照してください。
Web サイトの作成
「チュートリアル : Visual Web Developer での基本的な Web ページの作成」を完了して、Visual Web Developer で Web サイトを既に作成している場合は、その Web サイトを使用して、このチュートリアルの後半にある「コントロールの追加」に進むことができます。それ以外の場合は、次の手順に従って、新しい Web サイトおよびページを作成します。
メモ : |
---|
このチュートリアルは、コードに分離コード ファイルを使用する ASP.NET ページを使用していることを前提としています。 |
ファイル システム Web サイトを作成するには
Visual Web Developer を開きます。
[ファイル] メニューの [新しい Web サイト] をクリックします。
[新しい Web サイト] ダイアログ ボックスが表示されます。
[Visual Studio にインストールされたテンプレート] の [ASP.NET Web サイト] をクリックします。
右端の [場所] ボックスに、Web サイトを格納するフォルダの名前を入力します。
たとえば、フォルダ名として「C:\WebSites」と入力します。
[言語] ボックスで、作業に使用する言語をクリックします。
[OK] をクリックします。
Visual Web Developer によりフォルダが作成され、Default.aspx という名前の新しいページが作成されます。
ページの追加
既存の Web サイトを使用している場合は、新しいページを作成できます。ページが既にある場合は、このチュートリアルにそのページを使用して、次のセクションに進むことができます。
新規ページを作成するには
ソリューション エクスプローラで、Web サイト名を右クリックし、[新しい項目の追加] をクリックします。
[新しい項目の追加 <Path>] ダイアログ ボックスの、[Visual Studio にインストールされたテンプレート] の下の [Web フォーム] をクリックします。
[名前] ボックスに「FirstWebPage.aspx」と入力します。
[言語] ボックスで、作業に使用する言語をクリックします。
Visual Basic または C# でページを作成している場合は、[別のファイルにコードを書き込む] チェック ボックスをオンにします。
[追加] をクリックします。
コントロールの追加
Web サイトを作成してページを開いた後、次の手順では、ページにコントロールを追加します。
コントロールとデバッグ用のコードを追加するには
デザイン ビューに切り替えて、ツールボックスの [標準] グループから次のコントロールをページにドラッグし、表に示すとおりにプロパティを設定します。
コントロール
プロパティ
TextBox
ID : textName
Text : (空)
Button
ID : buttonDisplayName
Text : Submit
Label
ID : labelName
Text : (空)
メモ : このチュートリアルでは、ページのレイアウトは重要ではありません。
コードの追加
次の手順では、ページにコードを追加します。ページが正しく実行されている場合、ユーザーが名前を入力して [Submit] をクリックすると、名前が Label コントロールに表示されます。ユーザーがブラウザを閉じてページに戻ると、ユーザーの名前が Cookie に保存されているため、ページにはユーザーの名前が既に表示されています。
次の手順では、コードを追加します。コードを追加するための手順とコード自体のどちらも、完全に正しいわけではありません。これは、トレースを使用してページのエラーを検索できるように、意図的に設定されています。
コードを追加するには
ソリューション エクスプローラで FirstWebPage.aspx を右クリックし、[コードの表示] をクリックします。
メモ : デザイン ビューのボタンをダブルクリックしないでください。
クラス定義内に次のコードを入力します。
メモ : 単一ファイル ページを使用している場合は、コードを <script> ブロックに貼り付けます。
Protected Sub buttonDisplayName_Click(ByVal sender As Object, _ ByVal e As EventArgs) labelName.Text = Server.HtmlEncode(textName.Text) Response.Cookies("username").Value = labelName.Text End Sub
protected void buttonDisplayName_Click(Object sender, EventArgs e) { labelName.Text = Server.HtmlEncode(textName.Text); Response.Cookies["username"].Value = labelName.Text; }
コードは次のタスクを実行します。
TextBox コントロールの値を読み取り、Label コントロールに値を表示します。このロジックの一部として、コードは HtmlEncode メソッドを呼び出します。これにより、右山かっこ (<) などの実行可能な HTML 文字が、同等の表示に変換されます。これは、スクリプトによる攻略を防ぐためのセキュリティ対策です。詳細については、「スクリプトによる攻略」を参照してください。
ユーザーが入力した値を格納する username という名前の Cookie が作成されます。
前の手順で作成した Click ハンドラの上または下に、次のメソッドを追加します。
Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles Me.Load If Not Request.Cookies("username") Is Nothing Then labelName.Text = Request.Cookies("username").Value End If End Sub
void Page_Load(Object sender, EventArgs e) { if(Request.Cookies["username"] != null) { labelName.Text = Request.Cookies["username"].Value; } }
ページのテスト
ここでページをテストできます。前のセクションの手順から意図的に不完全な手順を実行した場合は、ページはデザインどおりに機能しません。
ページをテストするには
Ctrl キーを押しながら F5 キーを押してページを実行します。
ページが表示されたら、テキスト ボックスに名前を入力して、[Submit] をクリックします。
[Submit] をクリックして、ページがサーバーにポストバックされても、名前は表示されません。
ブラウザを閉じます。
これで、トレースを使用してページのエラーを検索できます。
トレースを使用したエラーの検索
ここでは、ページのトレースを有効にします。トレース出力を調べて、ページ エラーの特定に役立つカスタム トレース メッセージを含めます。
ページのトレースを有効にするには
FirstWebPage.aspx ページを開いて、デザイン ビューに切り替えます。
[プロパティ] の一覧の [DOCUMENT] をクリックします。
これにより、ページのプロパティが表示されます。
[Trace] を true に設定します。
トレース設定は、実際には @ Page ディレクティブの一部として行われます。これは、ソース ビューに切り替えて、ページの 1 行目を参照することで確認できます。@ Page ディレクティブは次のようになります。
<%@ Page language="VB" Trace="true" %>
<%@ Page language="C#" Trace="true" %>
Ctrl キーを押しながら F5 キーを押してページを実行します。
ブラウザにページが表示されます。ページの上部に、ページに配置したテキストとコントロールが表示されます。テキストとコントロールの下に、トレース出力が表示されます。これは、ページ処理に関するさまざまな詳細を示し、次の情報を含みます。
ページの実行中に発生したページ イベントのシーケンス
ページのコントロールの種類、名前、およびサイズ
Cookie とその内容
サーバー変数 (ブラウザがサーバーに送信するすべての情報のコレクション)
[要求の詳細] (トレース情報の最初のブロック) では、[要求の種類] は [GET] です。これは、ページが初めて実行されたことを示します。つまり、ポストバックではありません。
ボックスに名前を入力し、[Submit] をクリックします。
[要求の種類] が [POST] になります。これは、これがページのポストバックであることを示します。[Submit] をクリックしても、名前は表示されません。
ブラウザを閉じます。
カスタム トレース出力を使用すると、ページのロジックを実行できます。
カスタム トレース出力を追加するには
このチュートリアルの前半の「コードの追加」で作成した buttonDisplayName_Click ハンドラに、次の強調表示された行を追加します。
Protected Sub buttonDisplayName_Click(ByVal sender As Object, _ ByVal e As EventArgs) Trace.Warn("debugging", "Start buttonDisplayName Click handler") labelName.Text = Server.HtmlEncode(textName.Text) Response.Cookies("username").Value = labelName.Text Trace.Warn("debugging", "End buttonDisplayName Click handler") End Sub
protected void buttonDisplayName_Click(Object sender, EventArgs e) { Trace.Warn("debugging", "Start buttonDisplayName Click handler"); labelName.Text = Server.HtmlEncode(textName.Text); Response.Cookies["username"].Value = labelName.Text; Trace.Warn("debugging", "End buttonDisplayName Click handler"); }
Warn メソッドによって、トレース出力にカスタム メッセージが追加されます。TraceContext クラスは Write メソッドも提供しますが、出力がカラー表示されるため、Warn メソッドの方が便利です。
Ctrl キーを押しながら F5 キーを押してページを実行します。
[Submit] をクリックします。
トレース出力を調べると、出力に赤いテキストがないことがわかります。これにより、[Submit] の Click ハンドラが呼び出されていないことがわかります。
ハンドラが呼び出されない最も一般的な理由は、コントロールがイベント ハンドラに正しくバインドされていないことです。この場合、これに当てはまります。つまり、イベント処理コードを追加しましたが、[Submit] の Click イベントをハンドラにバインドしませんでした。通常、デザイン ビューでコントロールをダブルクリックすると、Visual Web Developer によってイベントがコントロールにバインドされます。
ブラウザを閉じます。
ソース ビューで、次の強調表示された属性を <asp:button> 要素に追加します。
<asp:button id="buttonDisplayName" runat="server" text="Submit" onclick="buttonDisplayName_Click" />
Ctrl キーを押しながら F5 キーを押してページを実行します。
ボックスに名前を入力し、[Submit] をクリックします。
カスタム トレース出力が [トレース情報] セクションに赤で表示されます。これは、ページで実行された処理手順を示します。
このセクションの出力では、ページ処理中にメッセージが発生した順にメッセージが表示されます。Click イベント ハンドラでメッセージを追加しました。これは、Begin Raise PostBackEvent 行と End Raise PostBackEvent 行の間で処理されます。カスタム メッセージを含めると、ハンドラが呼び出されたことだけでなく、ページ処理サイクルでコードが実行された位置もわかります。
カスタム メッセージの横にあるカテゴリは debugging です。これは、Warn メソッドを呼び出したときに指定したカテゴリです。任意のカテゴリを指定できます。必要に応じて、ページの TraceMode プロパティを SortByCategory 値に設定すると、トレース出力内のカテゴリの検索が簡単になります。
また、入力した名前は、ラベルにも表示されます。
[Submit] の Click ハンドラが正常に動作しているため、Cookie を含む、ページのコードの残りの部分をテストできます。
Cookie をテストするには
ブラウザを閉じます。
Ctrl キーを押しながら F5 キーを押してページを実行します。
予測される動作は、入力した名前がラベルに自動的に表示されることです。これは、[Submit] の Click ハンドラにより Cookie が設定され、Page_Load ハンドラが次のポストバック中にその Cookie を読み取るためです。ただし、ラベルが Cookie から設定されることはありません。
Cookie を記述していて、永続化していない場合、多くのエラーは Cookie に明示的な有効期限が設定されていないというものです。有効期限のない Cookie は、セッション Cookie です。セッション Cookie は、ブラウザを閉じるまでの間だけサーバー メモリに保持されます。つまり、Cookie はブラウザには書き込まれません。次の手順では、この問題を修正します。
ブラウザを閉じます。
ソース ビューで、次の強調表示された行を buttonDisplayName_Click ハンドラに追加します。
Protected Sub buttonDisplayName_Click(ByVal sender As Object, _ ByVal e As EventArgs) Trace.Warn("debugging", "Start buttonDisplayName Click handler") labelName.Text = Server.HtmlEncode(textName.Text) Response.Cookies("username").Value = labelName.Text Response.Cookies("username").Expires= _ DateTime.Now.AddMinutes(30) Trace.Warn("debugging", "End buttonDisplayName Click handler") End Sub
protected void buttonDisplayName_Click(Object sender, EventArgs e) { Trace.Warn("debugging", "Start buttonDisplayName Click handler"); labelName.Text = Server.HtmlEncode(textName.Text); Response.Cookies["username"].Value = labelName.Text; Response.Cookies["username"].Expires= DateTime.Now.AddMinutes(30); Trace.Warn("debugging", "End buttonDisplayName Click handler"); }
新しい行によって、Cookie の有効期限が明示的に 30 分と設定されます。
Ctrl キーを押しながら F5 キーを押してページを実行します。
ボックスに名前を入力し、[Submit] をクリックします。
ブラウザに名前が表示されます。[Response Cookies のコレクション] トレース出力で、Cookie が設定されていることを確認できます。
ブラウザを閉じます。
Ctrl キーを押しながら F5 キーを押してページを実行します。
今度は、名前が自動的に入力されます。[Request Cookies のコレクション] トレース出力で、ブラウザがページに Cookie を渡していることを確認できます。
トレース ビューア ウィンドウでのトレース情報の表示
1 ページのみを使用している場合、トレース出力を表示するようにページを設定すると便利です。ただし、アプリケーションで複数のページを使用している場合、ページごとにトレースをオンまたはオフに設定すると不便なことがあります。さらに、ページの実行中にトレース出力情報をページに表示すると、混乱する可能性があります。いずれにしても、アプリケーションのユーザーにトレース出力をページに表示させることはありません。
ページ レベルだけでなく、アプリケーション レベルでもトレースを設定できます。アプリケーション レベルでのトレースの設定には、2 つの利点があります。
すべてのページについて、トレースを同時に有効または無効にできます。
トレース出力をページの出力の一部として表示するのではなく、個別のブラウザ ウィンドウ (トレース ビューア) に表示できます。
アプリケーション レベルのトレースが有効になっている場合、ASP.NET では、すべてのページからのトレース出力がキャッシュに保持されます。トレース出力でキャッシュされるページ数、および最新または最も古いエントリを保持するかどうかを指定するオプションを設定できます。次に、ブラウザでトレース ビューアを呼び出して、調べるトレース出力を選択できます。
チュートリアルのこのセクションでは、アプリケーション レベルのトレースを有効にし、トレース ビューアを使用してトレース出力を調べます。
アプリケーション レベルのトレースを有効にするには
ソース ビューに切り替えて、ページの上部にある @ Page ディレクティブで Trace="true" を削除します。
メモ : 属性を削除します。属性を false に設定しないでください。それ以外の場合、このチュートリアルの以降の手順が正しく動作しません。
[Web サイト] メニューの [ASP.NET の構成] をクリックします。
ASP.NET Web サイト管理ツールが表示されます。
[アプリケーション構成] をクリックします。
[デバッグとトレース] の [デバッグとトレースの構成] をクリックし、[トレース情報のキャプチャ] チェック ボックスをオンにします。
このように設定すると、アプリケーション レベルのトレースが有効になります。
このチュートリアルでは、残りの設定を既定値のままにしておくことができます。ASP.NET では、トレース出力の最大 10 個のエントリ (1 ページの 10 個のポストバックまたは複数ページの 10 未満のポストバック) がキャッシュされ、最新のエントリがキャッシュされます。
ASP.NET Web サイト管理ツールを閉じます。
これで、元のページを実行して、ユーザーに表示される場合と同じようにページを使用できます。ただし、同時に、個別のブラウザ ウィンドウに表示する必要がある場合にも、トレース出力が表示されます。
トレース出力を個別のブラウザ ウィンドウに表示するには
Ctrl キーを押しながら F5 キーを押してページを実行します。
ページにトレース出力が表示されなくなります。ページは、ユーザーに表示される場合と同じように表示されます。
ボックスに名前を入力し、[Submit] をクリックして、そのページが正しく動作することを確認します。
新しいブラウザ ウィンドウを開きます。
ブラウザの [アドレス] ボックスに、使用中のページの名前を「trace.axd」に置き換えて、サイトの URL を入力します。
たとえば、次のページの URL の場合は、
https://localhost:8081/WebSite/Default.aspx
次のように入力します。
https://localhost:8081/WebSite/trace.axd
メモ : このタスクを簡単に実行するには、元のページから URL をコピーして、ページ名だけを変更します。
トレース エントリの現在のキャッシュがブラウザに表示されます。
最後 (最新) のトレース エントリの [詳細の表示] をクリックします。
このチュートリアルの前半で表示したようなトレース出力がブラウザに表示されます。ただし、ページの最後に追加されていない点が異なります。
元のページを含むブラウザ インスタンスに切り替えます。
ボックスに新しい名前を入力し、[Submit] をクリックします。
このアクションにより、新しいトレース ログ エントリが生成されます。
情報を含むブラウザ インスタンスに切り替えます。
ブラウザの [戻る] をクリックしてトレース エントリの一覧に戻り、[更新] をクリックしてエントリの一覧を更新します。
手順 7 で作成したトレース出力を示す新しいエントリが表示されます。
両方のブラウザ ウィンドウを閉じます。
カスタム トレース出力の作成
これまで見てきたように、トレース出力にはさまざまな情報が含まれています。必要以上の情報が含まれている場合もあります。たとえば、トレース出力を、自分で作成したトレース出力だけに制限する場合があります。トレースを使用すると、トレース バッファの内容を読み取って、必要な情報を選択的に表示できます。
カスタム トレース出力を作成するには、Trace オブジェクトの TraceFinished イベントを処理します。イベント ハンドラでトレース バッファを読み取ることができます。
カスタム トレース出力を作成するには
使用しているページで、次の強調表示されたコードを Page_Load ハンドラに追加します。
Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Me.Load If Not Request.Cookies("username") Is Nothing Then labelName.Text = Request.Cookies("username").Value End If AddHandler Trace.TraceFinished, AddressOf Me.TraceFinished If IsPostBack Then Trace.Write("debugging", "Page_Load (Postback)") Else Trace.Write("debugging", "Page_Load (First Time)") End If End Sub
void Page_Load(object sender, EventArgs e) { if(Request.Cookies["username"].Value != null) { labelName.Text = Request.Cookies["username"].Value; } Trace.TraceFinished += new TraceContextEventHandler(this.TraceFinished); if (Page.IsPostBack) { Trace.Write("debugging", "Page load (postback)"); } else { Trace.Write("debugging", "Page load (first time)"); } }
このコードは、次の 2 つの機能を実行します。
ページ内のメソッドを、Trace オブジェクトの TraceFinished イベントにバインドします。これは、ページのトレース出力が完了したときに呼び出されます。メソッドは、次の手順で記述します。
トレース情報を記述します。
TraceFinished イベントを処理する次のメソッドを作成します。
Sub TraceFinished(ByVal sender As Object, _ ByVal e As TraceContextEventArgs) Dim traceRecord As TraceContextRecord For Each traceRecord In e.TraceRecords If traceRecord.Category = "debugging" Then Response.Write("<BR>" & traceRecord.Message) End If Next End Sub
void TraceFinished(object sender, TraceContextEventArgs e) { foreach(TraceContextRecord traceRecord in e.TraceRecords) { if(traceRecord.Category == "debugging") { Response.Write("<br>" + traceRecord.Message); } } }
このコードは、トレース出力の完了時に実行されます。トレース バッファは、e イベント引数の TraceRecords プロパティでコレクションとして使用できます。コードはコレクションを反復処理し、カテゴリとして debugging が設定されたトレース レコードの値を表示します。このチュートリアルでは、すべてのカスタム トレース出力のカテゴリを debugging に設定しています。
チュートリアルのこの時点では、Web サイトはすべてのページのトレースを有効にするように設定されていますが、トレース出力は、ページではなくトレース ビューアに渡されます。トレース出力がページに表示される場合など、Web サイトの設定が異なる場合は、チュートリアルの前半の「トレース ビューア ウィンドウでのトレース情報の表示」にある「アプリケーション レベルのトレースを有効にするには」の手順に従います。
ここで、カスタム トレース出力をテストできます。
カスタム トレース出力をテストするには
Ctrl キーを押しながら F5 キーを押してページを実行します。
ブラウザにページが表示されると、"Page load (first time)" というメッセージが表示されますが、その他のトレース出力は表示されません。
[Submit] をクリックします。
"Page load (postback)"、"Start buttonDisplayName Click handler"、および "End buttonDisplayName Click handler" というメッセージが表示されます。
メモ : |
---|
trace 要素 (ASP.NET 設定スキーマ) の requestLimit 属性で指定されている、キャッシュされた要求の数を超えた場合、TraceFinished イベントは発生せず、Web ページにはメッセージは表示されません。 |
次の手順
このチュートリアルでは、ASP.NET でトレースを行う基本機能について説明しています。Web アプリケーションに情報を表示するためにトレース機能を使用するだけでなく、ASP.NET のトレース機能を他のインストルメンテーションと統合できます。たとえば、次の処理を実行できます。
システム診断メッセージを ASP.NET トレースの一部として表示します。
詳細については、「チュートリアル : ASP.NET トレースと System.Diagnostics トレースの統合」を参照してください。
ASP.NET トレース情報を .NET Framework トレース機構に送信します。.NET Framework トレース機構では、System.Diagnostics 名前空間のクラスが使用されます。
Web サイトの状態監視の一部として、登録されたインストルメンテーション リスナに情報を転送します。
リスナの登録の詳細については、「<trace> の <listeners> 要素」を参照してください。