我们需要从 javascript 访问一个 sharepoint 2007 站点。基本上我们需要使用 search.asmx 服务,但由于它不支持 rest 也不支持 jsonp 它不能直接使用。
最初的计划是制作支持rest和jsonp的自定义wcf服务。这是一项小任务,但是当我将服务提供给 Sharepoint 的人时,他们都无法将其打包到 wsp 包中以便在 sharepoint 2007 中安装并使其正常工作。
根据这个问题Rest Webservices for Sharepoint 2007这可能不是那么容易,rest-typed urls 需要一个 httpmodule。将其作为独立应用程序运行的另一个想法可能还不够,因为我认为该服务需要访问 SPContext。
是否可以只创建一个应用程序页面并在代码中覆盖渲染,清除输出缓冲区,更改 mime 类型并渲染 json 序列化数据?所以网址是http://spsite/mycustomquery.aspx?q=mysearchtext&start=0&count=200&callback=mycallbackfunction
.
应用程序页面至少会支持 Get,但它是否有权访问 SPContext?
这是我开始使用的 wcf 服务。
合同
[ServiceContract]
public interface IRestSPQuery
{
[OperationContract]
[WebGet(UriTemplate = "query/{queryText}/{startAt}/{count}?callback={callback}", ResponseFormat = WebMessageFormat.Json)]
[JSONPBehavior(callback = "callback")]
ResultTable Query(string queryText, string startAt, string count, string callback);
}
执行
public ResultTable Query(string queryText, string startAt, string count, string callback)
{
//http://sharepointsite/_vit_bin/CustomQuery/RestSPQuery.svc/Query/searchtext/0/200?callback=myfunction
KeywordQuery keywordQuery = new KeywordQuery(SPContext.Current.Site);
keywordQuery.StartRow = startAt;
keywordQuery.RowLimit = count;
keywordQuery.SortList.Add("Rank", SortDirection.Descending);
keywordQuery.QueryText = queryText;
ResultTableCollection searchResults = keywordQuery.Execute();
ResultTable relevantResultsTable = searchResults[ResultType.RelevantResults];
return relevantResultsTable;
}