逐步解說:使用 IntelliTrace 偵錯 SharePoint 應用程式
您可以藉由使用 IntelliTrace 更輕鬆地偵錯應用程式,包括併入網頁的應用程式 (例如 SharePoint 方案)。 傳統的偵錯工具只會顯示應用程式在目前時間的狀態快照。 但是,您可以使用 IntelliTrace 來檢閱,甚至巡覽到應用程式內發生的過去事件以及事件發生所在的內容。
本逐步解說示範如何使用 IntelliTrace,在 Visual Studio 2010 中偵錯 SharePoint 專案。 此專案會併入功能接收器,當啟用此功能時,它會將工作加入至工作清單,並將公告加入至公告清單。 當停用此功能時,此工作會標示為已完成,並將第二個公告加入至公告清單。 但是,此程序包含一個邏輯錯誤,該錯誤使得專案無法正確執行。 您可以藉由使用 IntelliTrace 來尋找及更正此錯誤。
這個逐步解說將說明下列工作:
建立功能和功能事件接收器。
使用程式碼回應功能事件。
使用程式碼參考工作和公告清單。
使用程式碼尋找和操作清單項目。
使用 IntelliTrace 尋找及更正程式碼錯誤。
-
注意事項 在使用者介面中某些項目的名稱或位置方面,您的電腦可能與本主題的指示不同。 這些項目會因為您的 Visual Studio 版本的設定而不同。 如需詳細資訊,請參閱 使用設定。
必要條件
您需要下列元件才能完成此逐步解說:
支援的 Windows 和 SharePoint 版本。 如需詳細資訊,請參閱開發 SharePoint 方案的要求。
Visual Studio 2010 Professional SP1、Visual Studio 2010 Premium SP1 或 Visual Studio 2010 Ultimate SP1。
建立功能接收器
首先,您要建立具有功能接收器的空白 SharePoint 專案。
若要建立功能接收器
使用 [以系統管理員身分執行] 選項來啟動 Visual Studio。
在 [檔案] 功能表上,指向 [新增],然後按一下 [專案]。
[新增專案] 對話方塊隨即出現。
在對話方塊的頂端,按一下清單中的 [.NET Framework 3.5] (如果尚未選取)。
在您想要使用的語言下方,展開 [SharePoint] 節點,然後按一下 [2010] 節點。
在 [範本] 窗格中按一下 [空的 SharePoint 專案],將專案名稱變更為 IntelliTraceTest,然後按一下 [確定]。
隨即出現 [SharePoint 自訂精靈],您可以在其中指定專案的 SharePoint 網站及方案的信任層級。
按一下 [部署為陣列方案],然後按一下 [完成]。
IntelliTrace 只會在陣列方案上操作。
在 [方案總管] 中,以滑鼠右鍵按一下 [功能] 節點,然後按一下 [加入功能]。
隨即出現 Feature1.feature。
以滑鼠右鍵按一下 Feature1.feature,然後按一下 [加入事件接收器],將程式碼模組加入此功能。
將程式碼加入至功能接收器
接下來,將程式碼加入至功能接收器中的兩個方法:FeatureActivated 和 FeatureDeactivating。 每當分別在 SharePoint 中啟用或停用功能時,都會觸發這些方法。
若要將程式碼加入至功能接收器
在 Feature1.EventReceiver 類別頂端,加入下列程式碼來宣告可指定 SharePoint 網站與子網站的變數:
' SharePoint site/subsite. Private siteUrl As String = "https://localhost" Private webUrl As String = "/"
// SharePoint site/subsite. private string siteUrl = "https://localhost"; private string webUrl = "/";
以下列程式碼取代 FeatureActivated 方法:
Public Overrides Sub FeatureActivated(ByVal properties As SPFeatureReceiverProperties) Try Using site As New SPSite(siteUrl) Using web As SPWeb = site.OpenWeb(webUrl) ' Reference the lists. Dim announcementsList As SPList = web.Lists("Announcements") Dim taskList As SPList = web.Lists("Tasks") ' Add a new announcement to the Announcements list. Dim listItem As SPListItem = announcementsList.Items.Add() listItem("Title") = "Activated Feature: " & Convert.ToString(properties.Definition.DisplayName) listItem("Body") = Convert.ToString(properties.Definition.DisplayName) & " was activated on: " & DateTime.Now.ToString() listItem.Update() ' Add a to-do task to the Task list. Dim newTask As SPListItem = taskList.Items.Add() newTask("Title") = "Deactivate feature: " & Convert.ToString(properties.Definition.DisplayName) newTask.Update() End Using End Using Catch e As Exception Console.WriteLine("Error: " & e.ToString()) End Try End Sub
public override void FeatureActivated(SPFeatureReceiverProperties properties) { try { using (SPSite site = new SPSite(siteUrl)) { using (SPWeb web = site.OpenWeb(webUrl)) { // Reference the lists. SPList announcementsList = web.Lists["Announcements"]; SPList taskList = web.Lists["Tasks"]; // Add a new announcement to the Announcements list. SPListItem listItem = announcementsList.Items.Add(); listItem["Title"] = "Activated Feature: " + properties.Definition.DisplayName; listItem["Body"] = properties.Definition.DisplayName + " was activated on: " + DateTime.Now.ToString(); listItem.Update(); // Add a to-do task to the Task list. SPListItem newTask = taskList.Items.Add(); newTask["Title"] = "Deactivate feature: " + properties.Definition.DisplayName; newTask.Update(); } } } catch (Exception e) { Console.WriteLine("Error: " + e.ToString()); } }
以下列程式碼取代 FeatureDeactivating 方法:
Public Overrides Sub FeatureDeactivating(ByVal properties As SPFeatureReceiverProperties) Try Using site As New SPSite(siteUrl) Using web As SPWeb = site.OpenWeb(webUrl) ' Reference the lists Dim taskList As SPList = web.Lists("Tasks") Dim announcementsList As SPList = web.Lists("Announcements") ' Add an announcement that the feature was deactivated. Dim listItem As SPListItem = announcementsList.Items.Add() listItem("Title") = "Deactivated Feature: " & Convert.ToString(properties.Definition.DisplayName) listItem("Body") = Convert.ToString(properties.Definition.DisplayName) & " was deactivated on: " & DateTime.Now.ToString() listItem.Update() ' Find the task the feature receiver added to the Task list when the ' feature was activated. Dim qry As New SPQuery() qry.Query = "<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>Deactive</Value></Contains></Where>" Dim taskItems As SPListItemCollection = taskList.GetItems(qry) For Each taskItem As SPListItem In taskItems ' Mark the task as complete. taskItem("PercentComplete") = 1 taskItem("Status") = "Completed" taskItem.Update() Next End Using End Using Catch e As Exception Console.WriteLine("Error: " & e.ToString()) End Try End Sub
public override void FeatureDeactivating(SPFeatureReceiverProperties properties) { try { using (SPSite site = new SPSite(siteUrl)) { using (SPWeb web = site.OpenWeb(webUrl)) { // Reference the lists SPList taskList = web.Lists["Tasks"]; SPList announcementsList = web.Lists["Announcements"]; // Add an announcement that the feature was deactivated. SPListItem listItem = announcementsList.Items.Add(); listItem["Title"] = "Deactivated Feature: " + properties.Definition.DisplayName; listItem["Body"] = properties.Definition.DisplayName + " was deactivated on: " + DateTime.Now.ToString(); listItem.Update(); // Find the task the feature receiver added to the Task list when the // feature was activated. SPQuery qry = new SPQuery(); qry.Query = "<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>Deactive</Value></Contains></Where>"; SPListItemCollection taskItems = taskList.GetItems(qry); foreach (SPListItem taskItem in taskItems) { // Mark the task as complete. taskItem["PercentComplete"] = 1; taskItem["Status"] = "Completed"; taskItem.Update(); } } } } catch (Exception e) { Console.WriteLine("Error: " + e.ToString()); } }
測試專案
現在此程式碼已加入至功能接收器,請執行 SharePoint 應用程式來測試它是否能正常運作。 在這個範例中,會有一個小的錯誤包含在程式碼中。 當錯誤發生之後,您將會使用 IntelliTrace 來追蹤問題。
若要測試專案
按 F5 執行專案。
一旦部署之後,此功能就會自動啟用,使得它的功能接收器加入公告和工作。
在 SharePoint 啟動之後,按一下巡覽窗格中的 [清單],然後按一下公告清單和工作清單,以檢視其內容。
在公告清單中,已加入名為 Activated feature: IntelliTraceTest_Feature1 的新公告,而且名為 Deactivate feature: IntelliTraceTest_Feature1 的新工作已加入至工作清單。 此工作的狀態為「尚未開始」。
若要停用此功能,請按一下 [網站動作] 底下的 [管理網站功能],再按一下 [IntelliTraceTest Feature1] 旁邊的 [停用],然後按一下警告頁面中的 [停用此功能] 連結。
工作的 [狀態] 值現在應該為「已完成」,而且它的 [% 完成] 值應該是 “100%”。但是,這些值依然為預設值的狀態。 程式碼中的錯誤會使得工作無法更新。
對專案進行偵錯
使用 IntelliTrace 尋找及修正程式碼中的問題。
若要對專案進行偵錯
在 FeatureDeactivating 方法中,找出 SPQuery qry = new SPQuery(); 行,然後按 F9 在該行插入中斷點。
因為問題發生在停用此功能時,所以這一行是開始偵錯的合理位置。
按 F5 再次執行程式,然後重複本主題稍早「若要測試專案」的步驟來啟用及停用此功能。
在 FeatureActivated 中遇到中斷點時,IntelliTrace 視窗就會出現,並列出應用程式目前為止所採取的所有步驟。
按 F11 逐步完成程式碼的每一行,直到程式完成為止。
每當您按 F11 時,另一行「偵錯工具:」就會加入至應用程式的 IntelliTrace 偵錯記錄。
在程式完成之後,請按一下 IntelliTrace 視窗中的 [全部中斷] 連結。
您必須採取此步驟,才能儲存 IntelliTrace 資料。
若要選擇檢視應用程式的呼叫資訊,請按一下 IntelliTrace 工具列上的 [開啟 IntelliTrace 設定],然後按一下 [IntelliTrace 事件和呼叫資訊]。
在 IntelliTrace 工具列上按一下 [儲存目前 IntelliTrace 工作階段],以儲存及偵錯資料。
此檔案的副檔名為 .iTrace。
在 Visual Studio 中,按一下 [停止偵錯]。
開啟 .iTrace 檔。
這個步驟會開啟另一個 Visual Studio 執行個體來顯示 [IntelliTrace 摘要] 頁面,此頁面會提供偵錯資訊 (例如例外狀況資料) 和程式中使用的執行緒清單。
展開 [執行緒清單],再按一下 [主執行緒],然後按一下 [開始偵錯]。
這個步驟會在 Visual Studio 中使用 .iTrace 資料來開始偵錯工作階段。 若要檢視 IntelliTrace 視窗中有關事件的其他詳細資料,請按一下它。
因為我們懷疑錯誤發生在 FeatureDeactivating 方法中,所以請在 SPListItemCollection taskItems = taskList.GetItems(qry); 的 [偵錯工具:] 步驟中按一下 [區域變數] 連結。
[區域變數] 視窗隨即出現。
在 [區域變數] 視窗中,展開變數清單、尋找 qry.Query,然後確認找出此工作的查詢是否錯誤搜尋 “Deactive” 而不是 “Deactivate”。
這個錯誤表示,工作清單的查詢中絕對不會找到此工作。
重新測試專案
現在您已經使用 IntelliTrace 找出問題,請更正錯誤,然後重新測試專案。
若要重新測試專案
關閉 Visual Studio 的偵錯工作階段,然後重新開啟 IntelliTraceTest 專案 (如果尚未開啟)。
在程式碼的查詢字串 (qry.Query = "<Where><Contains><FieldRef Name='Title' /><Value Type='Text'>Deactive</Value></Contains></Where>") 中,將值從 Deactive 變更為 Deactivate。
按 F5,再次執行專案。
開啟工作清單,並確認 Deactivate 工作的 [狀態] 值現在正確設定為「已完成」,而且它的 [% 完成] 值為 100%。