SharePoint検索Webサービスの使用
今回のアプリケーションでは実際の検索はSharePointの検索Webサービスに依存します。この検索機能はWebサービスとして公開されているため、アプリケーションで使用するSOAPクライアントを作成して使用します。
前のセクションでExpression Blendを使用して作成したプロジェクトを、今度はVisual Studioで開きます。
検索用Webサービスを使用するために、以下のような検索サービス用アドレス(.asmxファイルへのURL)をもとに、このサービスへの参照をVisual Studioのプロジェクトに追加します。
http://<サーバー名あるいはアドレス>/_vti_bin/spearch.asmx
アドレスを指定したサービスの参照ダイアログは以下のようになります。
![図9 検索Webサービスへのサービス参照設定](http://cz-cdn.shoeisha.jp/static/images/article/4726/image010.jpg)
追加されたサービス参照をアプリケーション内で使用するには、サービス用SOAPクライアントオブジェクトを作成し、クライアントのQueryExCompletedイベントハンドラーを実装します。
検索サービスを使用する際には実際にクエリとして使用されるXML文字列を送る必要があります。この文字列はQueryExAsyncメソッドを使用してクエリ用文字列(QueryPacket)を送信することで検索が実行されます。クエリ内では検索パネル内に入力された値をクエリのQueryText項目に追加します。今回使用されるクエリ文字列は以下のようになります。
string keywords = this.txtKeywords.Text; string qXMLString = "<QueryPacket xmlns='urn:Microsoft.Search.Query'>" + "<Query><SupportedFormats><Format revision='1'>" + "urn:Microsoft.Search.Response.Document:Document</Format>" + "</SupportedFormats><Context><QueryText language='ja-JP' type='STRING'>" + keywords + "</QueryText></Context></Query></QueryPacket>";
これでSharePointの検索Webサービスを呼び出す準備が整いました。SOAPクライアントを使用した検索処理は以下のようになります。
SharePointのクエリWebサービスの使用についてはMSDN「Windows SharePoint Serviceの検索アーキテクチャ」に詳細が記載されています。
private void GetSearchResult() { string keywords = this.txtKeywords.Text; string qXMLString = "<QueryPacket xmlns='urn:Microsoft.Search.Query'>" + "<Query><SupportedFormats><Format revision='1'>" + "urn:Microsoft.Search.Response.Document:Document</Format>" + "</SupportedFormats><Context><QueryText language='ja-JP' type='STRING'>" + keywords + "</QueryText></Context></Query></QueryPacket>"; // 検索サービス用 SOAP クライアントを作成 SharePointSearch.SPSearch.QueryServiceSoapClient qsc = new SharePointSearch.SPSearch.QueryServiceSoapClient(); // サービス用認証情報を設定 // (使用する SharePoint サーバーのドメインアカウントを使用) UserNamePasswordClientCredential upcc = qsc.ClientCredentials.UserName; upcc.UserName = @"KALEHUAWEHE\Administrator"; upcc.Password = "Himitwo2"; // SPSearch Web サービスを使用 // QueyExCompleted イベントハンドラを設定 qsc.QueryExCompleted += new EventHandler<SharePointSearch.SPSearch.QueryExCompletedEventArgs>(qsc_QueryExCompleted); // 検索用クエリを実行 qsc.QueryExAsync(qXMLString); }
xamWebTileViewを使用した検索結果の表示
検索が終了した直後には非同期でQueryExCompletedイベントの発生が促されるため、このイベント用のハンドラーをあらかじめ定義しておくことが必要になります。
void qsc_QueryExCompleted(object sender, SharePointSearch.SPSearch.QueryExCompletedEventArgs e)
QueryExCompletedイベントハンドラーでは取得したデータを検索結果表示用xamWebTileViewコントロールのデータコンテキストに設定します(データコンテキストはすでにxamWebTileViewのItemSourceプロパティにバインドされるようにXAML上で設定されています)。これを実装するためには以下の手順が必要になります。
- 検索結果データ用オブジェクトの作成
- ViewModelの作成
- XMLドキュメントとして返されたデータを検索結果オブジェクトに変換
検索結果用データオブジェクトはSharePointの検索Webサービスから返されるデータをそのまま読み込めるようなオブジェクトを作成します(SPSearchRelevantResult.cs参照)。Silverlight 3ではADO.NETのDataSetなどが扱えませんが、その代わりにMVVM(Model-View-ViewModel)パターンで使用されるようなViewModelを作成してSilverlightのデータバインディング機能を活用することが一般的です。ここではSPSearchRelevantResultsオブジェクトをコレクションとして扱うViewModelを作成します。
MVVMパターンやViewModelについての詳しい説明はここでは割愛しますが、参考記事として以下のような記事へのリンクをあげておきます。興味のある方はご覧ください。
public class SPSearchResultDataSource : BaseViewModel { public SPSearchResultDataSource() { } private IEnumerable<SPSearchRelevantResult> result; public IEnumerable<SPSearchRelevantResult> Result { get { return this.result; } set { if (this.result != value) { this.result = value; this.OnPropertyChanged("Result"); } } } }
そして最後にXMLドキュメントとして返された検索結果をViewModel内のオブジェクトとしてセットします。作成したViewModelはxamWebTileViewのデータコンテキストとして設定することで、タイルビュー表示に使用されます。