[bug逃走中][.NET] 莫名奇妙的 "在根層次的資料無效,行1,位置1"

本回的 bug 逃走中,發生在 Windows Azure Platform 的 Service Management API 上。

Bug 逃走中,我們將扮演獵人,追捕躲在程式角落或是各種不同問題內的 bug (不論是程式中的 bug 或是無法讓程式正常運作的,都是 bug)~

 

這個問題是我在撰寫 EasyAzure Framework (即將於 9 月中推出的 Codeplex 新專案) 所發現的問題,在呼叫 Windows Azure 與 SQL Azure 的 Management REST API 時,有時會碰到來自 XML Parser 與服務擲出來的一個怪訊息:"在根層次的資料無效,行 1,位置 1",這個問題主要是發生在 XML 資料串中隱藏了分行符號或是看不見的字元符號,讓 XML Parser 辨識不出來,才會擲出這樣的錯誤,然而就算是使用 string.Replace() 把分行字元清掉,也無法將這個問題修復,因為 LoadXML() 方法無效,所以我思考改用 Load(),可是我又不想為了這個需求產生新檔案。

這時突然靈光一閃,想到了暫存檔案的功能,我可以運用 Windows 作業系統提供的暫存檔功能,將資料放到 Windows 作業系統所設定的暫存檔中,而且暫存檔名可以由作業系統控制,完全不需擔心檔案名稱處理的問題,所以我撰寫了下列程式碼:

FileInfo tempFile = new FileInfo(Path.GetTempFileName());
FileStream fs = tempFile.OpenWrite();

fs.Write(data, 0, data.Length);
fs.Close();

doc.Load(tempFile.FullName);

透過 Path.GetTempFileName(),開發人員可以很輕易的取得新的暫存檔的 FileInfo 物件,並利用 FileInfo.OpenWrite(), FileInfo.OpenRead() 或 FileStream 操作這個暫存檔,我們也不需要特別去清理,作業系統有自己的機制可做這件事,或是由使用者用磁碟清理工具進行清理。

在透過暫存檔將接取的 XML 寫入後再由 XML Parser 的 Load() 方法讀出來,成功解決此問題。

不過這個 bug 目前只是一個 Workaround (繞路解決),因為這算是隱藏在 Service Management API 內的一個問題,我也已經向美國反應這個問題,不過不知何時會被處理就是了。

Reference:

http://social.msdn.microsoft.com/Forums/en-US/ssdsgetstarted/thread/d3d55abc-1f35-4b05-8b33-960ce4e0c529