Webアプリケーションの作成
Visual Studioで、AJAX対応Webアプリケーションを新規作成します。

AjaxControlToolkit.dllを参照としてプロジェクトに追加します。
SlideService.asmxの作成
SlideService.asmxという名前のWebサービスを追加します。あらかじめ用意されている「Hello World」的な関数を、次のように変更します。
[WebMethod]
public AjaxControlToolkit.Slide[] GetSlides(String contextKey)
{
return null;
}
関数名はGetSlidesです。パラメータは、String型のcontextKeyです。contextKeyは、どのような方法でも使用できます。このパラメータは、呼び出し元AJAXコントロールからWebサービスに情報を渡すのに使用します。このアプリケーションでは、このパラメータを使用して、スライドショーのソースディレクトリを指定します。戻り値は、スライドの配列です。AJAX SlideShowコントロールがこのシグネチャを探すときには、シグネチャの大文字と小文字が厳密に区別されます。この構文を変更するとサービスが呼び出されなくなるので、変更しないでください。
次のキーをWeb.Configに追加します。
<add key="SlideServiceNoImagesFoundLocation"
value="NoImagesFound.jpg"/>
<add key="SlideServiceValidImageExtensions" value="jpg,gif,bmp,ico"/>
1番目のキーでは、contextKeyパラメータで指定されたディレクトリ内に画像が見つからない場合にスライドショーに表示する代替画像のWeb上での位置を設定します(今回の例ではWebサイトのルートにあります)。2番目のキーでは、ディレクトリ内の有効な拡張子のリストを設定します。これらの拡張子を持つ画像がスライド配列で返されます。
上の例では、「NoImagesFound.jpg」という名前の画像を指定しています。この画像は、この記事のダウンロードファイルに含まれています。アプリケーションには次のように表示されます。

画像NoImagesFoundを扱う関数は次のとおりです。この関数はGetSlides()から呼び出されます。
private AjaxControlToolkit.Slide[] GetNoImagesFoundDirectory() { AjaxControlToolkit.Slide[] slides = new AjaxControlToolkit.Slide[1]; // get image from web.config and verify it exists on file system _noImagesFoundWebLocation = System.Configuration.ConfigurationSettings.AppSettings.Get( "SlideServiceNoImagesFoundLocation"); if (!File.Exists(Server.MapPath(_noImagesFoundWebLocation))) throw new Exception("SlideService.asmx::GetNoImagesFoundDirectory - NoImagesFoundLocation found in
web.config does not exist after server.mappath - " + Server.MapPath(_noImagesFoundWebLocation)); // create slide from image slides[0] = new AjaxControlToolkit.Slide( _noImagesFoundWebLocation, "No Images Found: Please click on another directory", ""); // return slide return (slides); }
このGetNoImagesFoundDirectory関数は、要素を1つだけ持つSlide配列を作成します。この関数は、Web.Configから画像ファイルの場所を取得し、実際にファイルが存在するかどうかを確認します。次に、Slide配列に画像を追加し、別のディレクトリをクリックする必要があることをユーザーに示す見出しを追加します。
ここでは説明しませんが、この記事のダウンロードパッケージには、IsImage()およびGetImageExtensionsFromWebConfig()という2つの関数もあり、GetSlides()から呼び出されます。
GetSlides()関数は次のとおりです。
[WebMethod] public AjaxControlToolkit.Slide[] GetSlides(String contextKey) { // get valid extensions GetImageExtensionsFromWebConfig(); // contextKey not empty if (String.IsNullOrEmpty(contextKey)) return null; // contextKey in scope if ((contextKey.IndexOf("..")>=0)) return null; // verify contextKey directory exists String mapPath = Server.MapPath(contextKey); if (!Directory.Exists(mapPath)) throw new Exception( "SlideService.asmx::GetSlides - mapPath does not exist - " + Server.MapPath(mapPath)); // get files in contextKey directory string[] fileNames = System.IO.Directory.GetFiles(mapPath); if (fileNames.Length == 0) return GetNoImagesFoundDirectory(); // create generic empty list of slides List<AjaxControlToolkit.Slide> list = new List<AjaxControlToolkit.Slide>(); String justFileName; String displayedFileTitleOnSlider; String displayedFileDescriptionOnSlider; for (int i = 0; i < fileNames.Length; i++) { if(IsImage(Path.GetExtension(fileNames[i]))) { // get complete filename justFileName = Path.GetFileName(fileNames[i]); // get title displayedFileTitleOnSlider = Path.GetFileNameWithoutExtension(fileNames[i]); // set description to empty displayedFileDescriptionOnSlider = String.Empty; // add file to list of slides list.Add(new AjaxControlToolkit.Slide(contextKey + justFileName, displayedFileTitleOnSlider, displayedFileDescriptionOnSlider)); } } return (list.ToArray()); }
このGetSlides()関数は、Web.Configから有効なファイル拡張子を取得し、contextKeyが空でないことを確認し、安全性を確保するために、contextKeyがこのアプリケーションのスコープ内にあることを確認します。
次に、Server.MapPathを利用してcontextKeyをWeb上での位置からディスク上の物理的な位置に変換し、それが実際に存在するかどうかを確認します。その後、該当ディレクトリ内のファイルの名前をすべて文字列配列に取り込みます。
この文字列配列にファイル名が1つも含まれていない場合は、GetNoImagesFoundDirectory()関数を利用して画像NoImagesFoundを返します。次に、この関数は、ジェネリック型を利用して空のスライドリストを作成します。その後、ファイル名を反復処理して、有効な拡張子を検索します。有効な拡張子を持つファイル名は、スライド配列に追加していきます。ファイル名から拡張子を除いた部分を、スライドショー画像のタイトルにします。スライドショー画像の説明は空白にします。
続いて、次のクラス変数を追加します。
String _noImagesFoundWebLocation; //path and file of the image //containing "No Images Found" text String _arrayOfImageExtensions; //string of valid image file //extensions without "." in the //value ex "jpg,gif" String[] _extensionList; //string array of valid image file extensions // without "." and with comma removed
次の参照を追加します。
using System.Web.UI.WebControls; using System.Diagnostics; using System.IO; using System.Configuration; using System.Collections.Generic;
GetSlides関数の上部にある宣言に、次の行を追加します。
[System.Web.Script.Services.ScriptService()]
以上の作業が終了したら、WebサービスページSlideService.asmxを直接呼び出して、このサービスをブラウザでテストします。
次の形式の結果が得られることを確認します。
<Slide> <ImagePath>/images/Blue hills.jpg</ImagePath> <Name>Blue hills</Name> <Description /> </Slide>

GetNoImagesFoundDirectory - NoImagesFoundLocation found 