松崎さんのBlogに記載されていたAJAX+WebサービスのDemoを実装してみました。
http://blogs.msdn.com/tsmatsuz/archive/2008/06/09/vs08-sharepoint-ux-2-asp-net-ajax-web-part.aspx
Blogの中にあるSharePointへのWebサービスの登録手順について詳細に書いておきます(自分のメモのために・・・)。ちなみにMSDNに記載されているWebサービスの登録手順はこちら
手順1
SharePointハイブ(C:\Program Files\Common Files\Microsoft Shared\web server extensions\12)のTemplates\LayoutsにKakakuSearch.asmxをコピーした後(ISAPIだとDiscoが上手く動きませんでした…)、VSのコマンドプロンプト(すべてのプログラムにメニューがあります)からDiscoを実施(Disco http://servername:port/_layouts/KakakuSearch.asmx)します。そうすると、
C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\にKakakuSearch.discoとKakakuSearch.wsdlが作成されます
手順2
KakakuSearch.wsdlとKakakuSearch.discoの<?xml version="1.0" encoding="utf-8"?> を以下のコードと置き換えます
<%@ Page Language="C#" Inherits="System.Web.UI.Page" %>
<%@ Assembly Name="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="Microsoft.SharePoint.Utilities" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<% Response.ContentType = "text/xml"; %>
手順3
次に、KakakuSearch.discoの<ContractRef ref="http://servername:port/_layouts/KakakuSearch.asmx?wsdl"の"http://servername:port/_layouts/KakakuSearch.asmx?wsdl" を<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request) + "?wsdl"),Response.Output); %> に置き換え、次に、同様にdocRefの"http://servername:port/_layouts/KakakuSearch.asmx"を<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>に置き換えます。
手順4
次にKakakuSearch.discoの(2つある内の上のほうの)<soap address="http://servername:port/_layouts/KakakuSearch.asmx"の
"http://servername:port/_layouts/KakakuSearch.asmx"を
<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>に置き換えます。
同様に(2つある内の下のほうの)<soap address="http://servername:port/_layouts/KakakuSearch.asmx"を<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>に置き換えます
手順5
MSDNには
In the .wsdl file, make the following similar substitution for the SOAP address that is specified:
という表現がしてあり、「soap address=」を「soap:address location=」に置き換える??という風に理解しましたが、全く自信がありません。ちなみに、soap addressでもsoap:address locationでもどちらでもきちんと動作しました。InfoPathでWebサービスを呼び出した場合はsoap addressじゃないとダメみたいです…よくわかりません。
手順6
そして、KakakuSearch.discoをKakakuSearchdisco.aspxに変更し、KakakuSearch.wsdlをKakakuSearchwsdl.aspxに変更します。その後、KakakuSearch.asmxとKakakuSearchdisco.aspxとKakakuSearchwsdl.aspxをSharePointハイブのISAPIフォルダにコピーします。
手順7
SharePointハイブのISAPI/spdisco.exeを開き、下記の<contractRef>タグと<discoveryRef>タグを追加します。
<contractRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyCustomWebService.asmx?wsdl"), Response.Output); %>
docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyCustomWebService.asmx"), Response.Output); %>
xmlns=" http://schemas.xmlsoap.org/disco/scl/ " />
<discoveryRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(spWeb.Url + "/_vti_bin/MyCustomWebService.asmx?disco"),Response.Output); %>
xmlns="http://schemas.xmlsoap.org/disco/" />
以上で設定は終わりです。上記の設定以外は松崎さんのブログを参照してください。正直、かなり面倒臭かったです…というか背伸びし過ぎた感じです…本当に動いてよかったです!あ、ちなみに、検索ボックスに入れる文字は、Blog通りの文字を入れるか、前半の数人の部分を入れないときちんと結果が返ってきませんでした…