[WebForm]善用Search Service快速實作全文檢索
SharePoint功能很多且複雜,Search Service只是其中一個服務,
上一篇我們設定了企業搜尋服務,現在我們要善用這服務,
方便我快速開發全文檢索。
1.加入服務
格式:http://SERVER/_vti_bin/search.asmx
2.測試Search Service
下載SharePoint Search Service Tool,透過該工具幫我們建立Query XML String並測試
輸入ServerName
建立Querypacket XML
我選關鍵字解析,並更改Records和Locale。
測試執行Querypacket XML
我選擇返回DataSet
返回結果
執行成功後,複製該Query XML為Base加入專案並修改。
3.專案參考Query Web Service
當你參考MSDN上範例連接Query Web Service時會出現NTLM錯誤(如下圖),用Fiddler觀察永遠都回傳http 401(未經授權),
而一模一樣的程式碼我搬到WinForm或Application Console都沒問題(第2步驟我們也用SharePoint Search Service Tool測試也正常)
解決方法很多種,我測試了兩種方法,一是把Sharepoint site認證改用Kerbers,
但該認證會要求Server和Client都得加入網域,
這比較不符合我目前Policy(雖然比NTLM更安全、更有效率且更靈活),
二是使用NTLM但改用WCF Service傳送認證,而這也是我目前所使用的方法。
Web.config加入以下區段
Controller
[HttpPost]
public ActionResult Index(FormCollection fs )
{
string keyword = fs["keyword"];
QueryServiceSoapClient client = new QueryServiceSoapClient();
//Use the credentials of the user running the client application:
client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
client.ChannelFactory.Credentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
//Get Data
System.Data.DataSet queryResults = client.QueryEx(GenQueryXml(keyword, "Filte", 1, 100));
//automapper
List<SearchModel> _SearchModels = SourceTableMapping(queryResults.Tables[0]);
return View(_SearchModels);
}
結果
布林查詢
精確查詢
模糊查詢
參考