Sharepoint Web Service NullReferenceException Error

最近在整合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的對應,看到以下設定畫面的那一刻...

一切盡在不言中~~~

歡迎推文分享:
Published 29 January 2010 05:44 PM 由 Jeffrey
Filed under:
Views: 8,216



意見

# cycer said on 15 February, 2011 03:57 AM

Jeffrey大大

請問備用存取對應在設定時,怎麼讓內部URL與區域的公用URL不同啊?

就像你圖片所設定的一樣

我編輯公用URL後,內部URL與區域的公用URL都是相同的

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<January 2010>
SunMonTueWedThuFriSat
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication