逐步解說:使用 IntelliTrace 偵錯 SharePoint 應用程式
您可以藉由使用 IntelliTrace 更輕鬆地偵錯應用程式,包括併入網頁的應用程式 (例如 SharePoint 方案)。傳統的偵錯工具只會顯示應用程式在目前時間的狀態快照。但是,您可以使用 IntelliTrace 來檢閱,甚至巡覽到應用程式內發生的過去事件以及事件發生所在的內容。
本逐步解說示範如何使用 IntelliTrace,在 Visual Studio 中偵錯 SharePoint 專案。此專案會併入功能接收器,當啟用此功能時,它會將工作加入至工作清單,並將公告加入至公告清單。當停用此功能時,此工作會標示為已完成,並將第二個公告加入至公告清單。但是,此程序包含一個邏輯錯誤,該錯誤使得專案無法正確執行。您可以藉由使用 IntelliTrace 來尋找及更正此錯誤。
這個逐步解說將說明下列工作:
建立功能和功能事件接收器。
使用程式碼回應功能事件。
使用程式碼參考工作和公告清單。
使用程式碼尋找和操作清單項目。
使用 IntelliTrace 尋找及更正程式碼錯誤。
-
注意事項 在使用者介面中某些項目的名稱或位置方面,您的電腦可能與本主題的指示不同。這些項目會因為您的 Visual Studio 版本的設定而不同。如需詳細資訊,請參閱Visual Studio 設定。
必要條件
您需要下列元件才能完成此逐步解說:
支援的 Windows 和 SharePoint 版本。如需詳細資訊,請參閱開發 SharePoint 方案的要求。
Visual Studio 2012.
建立功能接收器
首先,您要建立具有功能接收器的空白 SharePoint 專案。
若要建立功能接收器
使用 [以系統管理員身分執行] 選項來啟動 Visual Studio。
在功能表列上,選擇 [檔案], [新增], [Project]。
[新增專案] 對話方塊隨即出現。
在對話方塊的頂端,選取 .NET Framework 版本的清單 [.NET Framework 3.5] 。
在您想要使用之語言下,展開 [SharePoint] 節點,然後選取 [2010] 節點。
在 [範本] 窗格中,選取 [SharePoint 2010 專案] 範本,將專案名稱變更為 IntelliTraceTest,然後選取 [確定] 按鈕。
隨即出現 [SharePoint 自訂精靈],您可以在其中指定專案的 SharePoint 網站及方案的信任層級。
選取 [部署為陣列方案] 選項按鈕,然後選取 [完成] 按鈕。
IntelliTrace 只會在陣列方案上操作。
在 [方案總管],開啟 [功能] 節點的捷徑功能表,然後選取 [加入功能]。
隨即出現 Feature1.feature。
從開啟 Feature1.feature 的捷徑功能表,然後選取 [加入事件接收器] 加入程式碼模組加入至功能。
將程式碼加入至功能接收器
接下來,將程式碼加入至功能接收器中的兩個方法:FeatureActivated 和 FeatureDeactivating。每當分別在 SharePoint 中啟用或停用功能時,都會觸發這些方法。
若要將程式碼加入至功能接收器
在 Feature1EventReceiver 類別頂端,加入下列程式碼來宣告可指定 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 尋找及修正程式碼中的問題。
若要對專案進行偵錯
在 Visual Studio,在 FeatureDeactivating 方法,找出 SPQuery qry = new SPQuery(); 行 Visual C# 或 Dim qry As New SPQuery() 行 Visual Basic。選擇 F9 鍵插入在該行上設定中斷點。
因為問題發生在停用此功能時,所以這一行是開始偵錯的合理位置。
選擇 F5 鍵再次執行程式,並將重複步驟在「測試專案」啟動然後停用功能之前在本主題。
在 FeatureDeactivating 中遇到中斷點時,IntelliTrace 視窗就會出現,並列出應用程式目前為止所採取的所有步驟。
在 [IntelliTrace]窗格,在 [生命週期事件] 分類,選取 [區域] 連結。
選擇 F11 鍵跳到下一行程式碼。
每當您選擇 F11 鍵,另一台「偵錯工具: 」行加入到應用程式的偵錯 IntelliTrace 記錄。
選擇 F11 鍵跳到下一行程式碼。
在 [區域] 窗格中,展開 [qry]名稱並注意 [查詢] 值會顯示為紅色。
這個類別表示找出工作的查詢不正確地搜尋「停用」而非「Deactivate」。這個錯誤表示工作在工作清單中的查詢從找不到。
選擇 F11 鍵跳到下一行程式碼。
在 [區域] 窗格中,展開 [taskItems]名稱,並注意 [計數] 值為零 (0)。
這個值表示 taskItems 集合不包含任何 qry 項目。
選擇 F5 鍵繼續偵錯。
在程式完成後,請選取 IntelliTrace 視窗的 [全部中斷] 連結。
您必須採取此步驟,才能儲存 IntelliTrace 資料。
您可以檢視應用程式的呼叫資訊,由在 Intellitrace 工具列,選取 [開啟 IntelliTrace 設定。] 連結,然後 [選項] ,在對話方塊中,選取 [IntelliTrace 事件和呼叫資訊] 選項按鈕。
在 IntelliTrace 工具列上,選擇 [儲存目前 IntelliTrace 工作階段] 按鈕儲存偵錯資料。
此檔案的副檔名為 .iTrace。
在 Visual Studio 功能表列上,選擇, [偵錯][停止偵錯]。
開啟 .iTrace 檔。
這個步驟開啟 [IntelliTrace 摘要] 頁面,提供偵錯資訊 (如例外狀況資料和執行緒清單用於程式。
展開 [執行緒清單。],選取,然後選取 [主執行緒][啟動偵錯] 按鈕。
這個步驟會在 Visual Studio 中使用 .iTrace 資料來開始偵錯工作階段。若要檢視關於事件的其他詳細資料在 IntelliTrace 視窗中,選取事件。
選取 [偵錯工具:]步驟的 [區域] 連結 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%。
請參閱
概念
使用 IntelliTrace 錄製程式碼執行以偵錯應用程式