WCF REST Starter Kit の Preview 版で同封されているSamplesのキャッシュに関する機能を調べて見たいと思います。

動作確認環境は次のとおり

  • 動作環境: IIS6.0 on Windows Server 2003 Standard Edition
  • 開発環境: Visual Studio 2008 Professional
  • .NET 3.5 SP1, WCF REST Starter Kit Preview

WCF REST Starter Kit Preview 版は次のリンクからダウンロードできます。
http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=18830

1. Cacing 機能

Caching1サンプルに、RESTful な WCF で使用できるようになったキャッシングのサンプルが含まれています。キャッシュ機能はASP.NET 2.0から提供されるキャッシュテクノロジを使用します。

WCFでキャッシュを有効にするには、 OperationContract がアノテートされたオペレーションに WebCacheAttribute をアノテートし、  CacheProfileName プロパティに構成セクションで指定した構成セクションで設定したoutputCacheProfilesのキャッシュ名nameを指定します。

Caching1 サンプルでは、web.configのキャッシュ設定は次のようになっています。

<system.web>
    <compilation debug="true"/>
    <authentication mode="None"/>
    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <clear/>
          <add name="CacheFor1Min" duration="60" enabled="true" location="Any" varyByParam="numItems"/>
        </outputCacheProfiles>
      </outputCacheSettings>
    </caching>
  </system.web>

キャッシュ設定のプロファイル名 CacheFor1Min が WCF の WebCacheAttribute で指定するプロファイル名となります。WebCacheAttributeを
使用して、キャッシュ機能を有効にする場合は、さらに、ASP.NET互換モード aspNetCompatibilityEnabled を trueに設定し、オペレーションにWebGetAttributeを使用する必要があります。RESTful用のキャッシュテクノロジなので、webHttpBindingを使用します。

構成ファイルでAsp.Netの互換モードを有効にする場合は次のように system.seviceModel 構成セクションを記述します。

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  </system.serviceModel>

Caching1 サンプルで使用されている シンジケーションフィードを作成するWebCacheを使用するメソッドの抜粋は次のようになっています。

/// <summary>
/// Returns an Atom feed.
/// </summary>
/// <param name="i"></param>
/// <returns>Atom feed in response to a HTTP GET request at URLs conforming to the URI template of the WebGetAttribute.</returns>
[WebHelp(Comment = "Sample description for GetFeed.")]
[WebCache(CacheProfileName="CacheFor1Min")]
[WebGet(UriTemplate = "?numItems={i}")]
[OperationContract]
public Atom10FeedFormatter GetFeed(int i){ ... }

WebCache(CacheProfileName="For1Min")でキャッシュのプロファイルを使用していることが分かります。

サンプルの場合は Service1.svc/?numItems=2 のようにIEからアクセスすると指定された数のフィードを取得できます。

デバッグ実行すると、numItemsの値を変更しない場合、GetFeedメソッドが実行されないことが確認できます。

上記抜粋ではWebHelpAttributeが使用されているのが分かります。これも新規のSystem.ServiceModel.Webネームスペースに含まれる Attribute で、 IE 上から svc ファイルに /help を付加するできるアドレス Service.svc/help にアクセスするとサービスのヘルプページを表示できます。

ちなみに、各サンプルではService.svcにとくべつなServiceFactoryの記述がしてあります。Service.svcを右クリックしてマークアップの表示を選択すると、特別な WebServiceHost (名前は WebServiceHost2 )を作成する ServiceFactory クラスが定義されています。開発中なので、このようになっているかは不明ですが。

2. おまけ

Caching1 サンプルに付属しているreadme.txtの翻訳を掲載しておきます。本文そのままを掲載してよいかわからないので、とりあえず日本語翻訳のみです。

本サンプルはキャッシュの期間を固定値60分とした場合のIISのキャッシュ機能を使用したデモサンプルです。

サンプルを動作させるには、サンプルを開始し、IEからサービスのURLにアクセスします。IEで同じURLに繰り返しアクセスするとブラウザに表示されるフィードのNumber of service invocations:の値に変化がないことが確認できます。

Sampleに付属するCaching2サンプルではSQLCacheDependencyを使用した場合のサンプルが掲載されています。キャッシュの有効期限に関してSQL Cache Dependency を使用することを除いて、Chacing1サンプルと同じだと思います。