[WebForm]善用Search Service快速實作全文檢索

[WebForm]善用Search Service快速實作全文檢索

SharePoint功能很多且複雜,Search Service只是其中一個服務,

上一篇我們設定了企業搜尋服務,現在我們要善用這服務,

方便我快速開發全文檢索。

 

1.加入服務

格式:http://SERVER/_vti_bin/search.asmx

image

 

2.測試Search Service

下載SharePoint Search Service Tool,透過該工具幫我們建立Query XML String並測試

image

輸入ServerName

 

建立Querypacket XML

image

我選關鍵字解析,並更改Records和Locale。

 

測試執行Querypacket XML

image

我選擇返回DataSet

 

返回結果

image

執行成功後,複製該Query XML為Base加入專案並修改。

 

3.專案參考Query Web Service

image

 

當你參考MSDN上範例連接Query Web Service時會出現NTLM錯誤(如下圖),用Fiddler觀察永遠都回傳http 401(未經授權),

而一模一樣的程式碼我搬到WinForm或Application Console都沒問題(第2步驟我們也用SharePoint Search Service Tool測試也正常)

image

 

解決方法很多種,我測試了兩種方法,一是把Sharepoint site認證改用Kerbers,

但該認證會要求Server和Client都得加入網域,

這比較不符合我目前Policy(雖然比NTLM更安全、更有效率且更靈活),

二是使用NTLM但改用WCF Service傳送認證,而這也是我目前所使用的方法。

 

Web.config加入以下區段

image

 

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);
        }

 

結果

布林查詢

image

 

精確查詢

image

 

模糊查詢

image

 

 

 

 

參考

Walkthrough: Querying FAST Search Server From a Client Application

SharePoint Search Service Tool

Kerberos和NTLM - SQL Server连接的那点事

IIS的各种身份验证详细测试