最近在整合Sharepoint的Search.asmx做客製化,一路上波折不斷。

很幸運地,找到一個好用的Open Source查詢工具--Sharepoint Search Sevice Tool,可以提供Scope、欄位資訊,用勾選就可以自動組出Query XML,按鈕後馬上看結果。複雜的Sharepoint Search瞬間被簡化,讓我這個新手在最短的時間可以進入狀況,真是勝造七級浮屠的聖品! (面對全然陌生的技術議題,當你手上有一個可以RUN的Sample,那種安全感無可言喻啊!)

不過,我並沒有因為獲得神奇道具就從此過著幸福快樂的日子。

我要處理的MOSS是由多台Server組成的Web Farm,測試發現同樣要連Search.asmx,某幾台Server OK,有幾台卻怎麼敲帳號密碼都不會過。仔細比對發現,有記憶連線帳號密碼的主機不必問帳號密碼就可以連上;遇上未記憶密碼的Server,怎麼輸入都會得到HTTP 401 UnauthorizedAccess Exception。

追了一下,發現問題出在原程式中未將Domain Name傳成NetworkCredential的第三個參數,修改後就可解決。(參考: NOTES-NetworkCredential Constructor for Domain Account)

殺掉小魔王後,遇到另一個更機車的問題。例如: 我的Web Farm FQDN是sps2007.darkthread.net,其中有五台機器,192.168.100.1 - 192.168.100.5。結果連到192.168.100.1/192.168.100.2 Search.asmx可以正常查詢,連至3, 4, 5三台則在呼叫Search.asmx GetPortalSearchInfo()時出現NullReferenceException。

爬文半天也毫無頭緒,後來心一橫決定鋸箭! 由於呼叫GetPortalSearchInfo是用來取得Scope清單,而另一個Method GetSearchMetadata也可以取得Scope清單,在文件上更是建議用它取代GetPortalSerachInfo。我把GetPortalSearchInfo的程式碼刪除,將Scope擷取邏輯交給GetSearchMetadata,暫時就閃開了這個問題。

只可惜高興不到兩分鐘,這番鋸箭雖然可以讓我連上3,4,5號機列出Scope,但只要一Query,就會彈出System.ArgumentNullException!! 能正確執行的還是只有1,2號機。

到此,我已耗去兩天時間(其間還試著用Reflector查看GetPortalSearchInfo想找出端倪、也設法試跑過Managed Object Model、當然也爬了無數的文),最後,看到有人提及用FQDN失敗、用Machine Name成功的案例,給了我一線生機。

偵辦方向由程式API規格轉到與SPS設定上,於是便問了一下熟悉架構的同事,原來Sharepoint 2007是有玄機的,有個備用存取對應決定了內部URL與公用URL的對應,看到以下設定畫面的那一刻...

一切盡在不言中~~~


Comments

# by cycer

Jeffrey大大 請問備用存取對應在設定時,怎麼讓內部URL與區域的公用URL不同啊? 就像你圖片所設定的一樣 我編輯公用URL後,內部URL與區域的公用URL都是相同的

Post a comment