前幾天微軟推出了 SharePoint Portal Server 及 Windows SharePoint Service 的 SP1,趁著休假前在 Lab 環境下與崔佛一起安裝測試,打算在測試完成後把 Production Server 上的環境也升級一下,沒想到在 Lab 環境升級之後出現了狀況。我們發現在幾個 Site 的首頁部分,有一個 Customize 過的 Webpart 內容出現了亂碼,這個 Webpart 的內容是使用 SharePoint 的 Search 對 SharePoint 的文件庫進行搜尋而跑出來的。本來以為是簡單的編碼問題,因為當初在客製化這個 Webpart 的時候,我們也曾經碰到 Search 回應結果的 XML 是 UTF-16 但實際上內容是 UTF-8 的問題,所以我們進行了一些簡單的轉換,看看微軟的 RD 是不是解了這個問題,而我們的程式卻多轉碼了一次。
進行後發現,在上了 SP1 後的 Search Result,它的編碼並不是 UTF-16 或 UTF-8 的其中一種,事實上不知到它回應的到底是哪一種編碼,可以理解的是,它回應了一堆的亂碼,XML 結構還是存在的,所有的英數字都正確,就是中文的部分全部都變成了亂碼。由於我們的環境是 SPS2003 的英文版本,所以開始懷疑這些亂碼是不是因為語言版本的關係所造成的 (未上 SP1 不會有問題)。於是另外再使用崔佛手上擁有的一個 SharePoint 中文版的 VM,抄了一段 Search 程式在 VM 上頭寫了個 Console Application 進行測試,發現只要上了 SP1,Search 回應的結果就會出問題,而不是語言版本的問題。
這個問題直接被反應到微軟的 Global Technical Support Center,由他們協助後續的問題處理。休假返回台北後,我們收到了 GTSC 的回應,確定了這是一個 SP1 的 Bug,而又作了一個簡單的 POC,把 GTSC 所提供的暫時解決方法套用在所有客製過,且應用到 Search 功能的程式碼中。以下是將亂碼還原的 ConvertGarbageCode function:
[csharp] public string ConvertGarbageCode (string s)
{
string answer = “”;
try
{
char[] chars = s.ToCharArray();
byte[] bytes = new byte[chars.Length];
for (int i = 0; i < bytes.Length; i++)
{
bytes[i] = System.Convert.ToByte(chars[i]);
}
answer = Encoding.UTF8.GetString(bytes);
return answer;
}
catch
{
answer = "";
return answer;
}
}
[/csharp]
在 SP2 出來之前,也許所有的 Search Result 都得套用這個 Function 才能正確的運作。但奇怪的是,在 Portal Server 中所提供的內建 Search 功能,回應的結果並不會有亂碼的現象,不知該作何解釋??難道它在實作 Search 的方法與 SDK 中的不同??
** 感謝 Oliver Lu, Microsoft Global Technical Support Center 的協助,得以在短時間內以他們所提供的 Sample Code 解決掉這個問題。