早くも 12 月ですね。12 月といえば Advent Calendar です。12 月 1 日から 24 日 (or 25 日) まで、様々なテーマのもとで日めくりカレンダーのように毎日ブログ記事を書いていくイベントが Advent Calendar です。

今年は私もひとつ参加することにしました。

One ASP.NET Advent Calendar 2012

仕事柄(?)、普段から Web 会やつや ASP.NET を中心としたブログを書いているので、Advent Calendar のスケジュールに合わせつつも、いつもどおりの記事を書いていきたいと思います。

私以外に、たくさんの ASP.NET 使いの方々が多くのネタを書いてくださるので、クリスマスの 25 日まで毎日が楽しみですね。

昨日の @naoki0311 さんのブログ

ASP.NET 入門者の方のためのASP.NET入門情報まとめ Ver 2012

は、ASP.NET の現在の全体像がよくまとまっていていい感じです。これから ASP.NET を始めたい方、改めて ASP.NET を学んでいきたい方など、多くの方に読んでいただきたい内容です。

さて、2 日目の私の記事ですが、担当日が今日 (12/2 日曜日!) なのをすっかり忘れていて、事前に少し用意していた環境をオフィスに置いてきてしまいました・・・というわけで急きょ、内容を変更して Web API ネタでお送りします。


★ ASP.NET Web API のトレース機能 (Tracing) を使う

※ ASP.NET Web API の概要などは、”ASP.NET Web API を使ってみよう: MVC 4 新機能シリーズ” などを参考にしてみてください。

以前の私のブログ記事

などでご紹介していた ASP.NET Fall 2012 Update (現在はプレビュー版) の ASP.NET Web API では、トレース機能とヘルプページ自動生成機能があらかじめプロジェクトテンプレートに組み込まれる予定です。これらの機能は、ASP.NET Fall 2012 Update をインストールしていない環境でも NuGet パッケージマネージャからプレビュー版をインストールして使用することができます。このうちのヘルプページ自動生成機能に関しては、以前の記事 “ASP.NET Web API のヘルプページ自動生成パッケージを試す” でご紹介しました。


そこで今回は、ASP.NET Web API のトレース機能について簡単にご紹介したいと思います。

このトレース機能を使うにあたって、まずは Web API のプロジェクトに Microsoft ASP.NET Web API Tracing パッケージ (現時点では 0.2.0-alpha 版) をインストールします。下記のスクリーンショットをご参考に、”Nuget パッケージの管理” ダイアログか、”パッケージ マネージャー コンソール” のいずれかの方法でパッケージのインスト���ルが可能です。

※ 上記の ASP.NET Fall 2012 Update をインストールした環境を使って新規に ASP.NET Web API プロジェクトを作成した場合は、この Web API Tracing パッケージがあらかじめプロジェクトに含まれていますのでインストールは不要です。

    
NuGet パッケージの管理ダイアログを使ったインストール

image

   
パッケージ マネージャー コンソールを使ったインストール

image


パッケージのインストールが完了すると、プロジェクトには System.Web.Http.Tracing.dll アセンブリと TraceConfig.cs ファイルが追加されます。(下記参照)

image


● トレース機能の有効化

続いて、Global.asax.cs ファイルか WebApiConfig.cs ファイルのいずれかに下記の一行を追加して、トレース機能を有効化します。

a) Global.asax.cs に記述する場合

public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);

TraceConfig.Register(GlobalConfiguration.Configuration);
}
}

b) WebApiConfig.cs に記述する場合

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);

TraceConfig.Register(config);
}
}


● トレース出力の確認

ASP.NET Web API プロジェクトをデバッグ実行します。ASP.NET Web API プロジェクトテンプレートで新規にプロジェクトを作成した場合には、実装例として ValuesController が用意されていますので、URL: “http://localhost:<ポート番号>/api/Values” に GET リクエストを送ると、Visual Studio 2012 (または Visual Studio 2010) デバッガの出力ウィンドウにリクエスト処理時のトレース情報が表示されることを確認できます。

下記のスクリーンショット (クリックして拡大) は、私がデモ用に用意した Message モデルクラスと MessageController クラスを使って、 “http://localhost:60248/api/Message” に対して GET リクエストを送った時のトレース情報です。

image


● トレース情報の出力レベルの設定

トレース出力のデフォルトの実装では TraceConfig.cs の Register メソッドで、SystemDiagnosticsTraceWriter が使われています。ここで、MinimumLevel パラメータや IsVerbose パラメータを変更することで出力したいトレース情報のレベルを変更することができます。

public static class TraceConfig
{
public static void Register(HttpConfiguration configuration)
{
if (configuration == null)
{
throw new ArgumentNullException("configuration");
}

SystemDiagnosticsTraceWriter traceWriter =
new SystemDiagnosticsTraceWriter()
{
MinimumLevel = TraceLevel.Error,
IsVerbose = true
};

configuration.Services.Replace(typeof(ITraceWriter), traceWriter);
}
}

 

● SystemDiagnosticsTraceWriter クラス

上記の TraceConfig.cs で使用されている、SystemDiagnosticsTraceWriter クラス定義 (アセンブリ System.Web.Http.Tracing.dll で実装) は下記となっています。

using System;
using System.Diagnostics;
using System.Net.Http;

namespace System.Web.Http.Tracing
{
public class SystemDiagnosticsTraceWriter : ITraceWriter
{
public SystemDiagnosticsTraceWriter();

public bool IsVerbose { get; set; }
public TraceLevel MinimumLevel { get; set; }
public TraceSource TraceSource { get; set; }

public virtual string Format(TraceRecord traceRecord);
public virtual string FormatDateTime(DateTime dateTime);
public virtual string FormatRequestEnvelope(TraceRecord traceRecord);
public virtual void Trace(HttpRequestMessage request, string category, TraceLevel level, Action<TraceRecord> traceAction);
public virtual void TranslateHttpResponseException(TraceRecord traceRecord);
}
}

 

この SystemDiagnosticsTraceWriter クラスの派生クラスを作って、Format メソッドなどの virtual メソッドをオーバーライドすることもできますし、ITraceWriter インターフェースを使って独自の TraceWriter クラスを作成することもできます。このあたりの詳細は下記のページなども参照してみてください。

Tracing in ASP.NET Web API

(思い付きですが、例えば ASP.NET SignalR などと組み合わせてリアルタイムで Web API の状況をモニタリングするなどの応用も考えられますね)


◆◆◆

Advent Calendar は UTC 時間基準という話もちらほら聞こえ来ましたが (笑)、何とか 12/2 JST のうちに書くことができました。というわけで One ASP.NET Advent Calendar 2012 二日目のネタはこの辺で。。。

明日は @kiyokura さんです。よろしくお願いします~