ASP.NET Web Pages (Razor) 月臺偵錯簡介
本文說明在 ASP.NET Web Pages (Razor) 網站中偵錯頁面的各種方式。 偵錯是在字碼頁中尋找和修正錯誤的程式。
您將瞭解的內容:
- 如何顯示有助於分析和偵錯頁面的資訊。
- 如何在 Visual Studio 中使用偵錯工具。
以下是文章中引進的 ASP.NET 功能:
- 協助
ServerInfo
程式。ObjectInfo
幫手。軟體版本
- ASP.NET Web Pages (Razor) 3
- Visual Studio 2013
本教學課程也適用于 ASP.NET Web Pages 2。 您可以使用 WebMatrix 3,但不支援整合偵錯工具。
針對程式碼中的錯誤和問題進行疑難排解的重要層面,是避免在一開始發生。 您可以藉由將可能造成錯誤 try/catch
的程式碼區段放入區塊,來完成此作業。 如需詳細資訊,請參閱 使用 Razor 語法處理 ASP.NET Web 程式設計簡介中的處理錯誤一節。
協助 ServerInfo
程式是一種診斷工具,可讓您概略瞭解裝載頁面之 Web 服務器環境的相關資訊。 它也會顯示瀏覽器要求頁面時所傳送的 HTTP 要求資訊。 協助 ServerInfo
程式會顯示目前的使用者身分識別、提出要求的瀏覽器類型等等。 這類資訊可協助您針對常見問題進行疑難排解。
建立名為 ServerInfo.cshtml的新網頁。
在頁面結尾處,緊跟在結尾
</body>
標記之前,新增@ServerInfo.GetHtml()
:<!DOCTYPE html> <html> <head> <title></title> </head> <body> @ServerInfo.GetHtml() </body> </html>
您可以在頁面的任何位置新增程式
ServerInfo
代碼。 但是,在結尾新增它將會將其輸出與其他頁面內容分開,這可讓您更容易閱讀。注意
重要 您應該先從網頁移除任何診斷程式代碼,再將網頁移至生產伺服器。 這適用于
ServerInfo
協助程式,以及本文中涉及將程式碼新增至頁面的其他診斷技術。 您不想讓網站訪客查看伺服器名稱、使用者名稱、伺服器上的路徑和類似詳細資料的相關資訊,因為這種類型的資訊對於惡意意圖的人可能很有用。儲存頁面並在瀏覽器中執行。
協助
ServerInfo
程式會在頁面中顯示四個資訊資料表:伺服器組態。 本節提供裝載網頁伺服器的相關資訊,包括電腦名稱稱、您正在執行的 ASP.NET 版本、功能變數名稱和伺服器時間。
ASP.NET 伺服器變數。 本節提供許多 HTTP 通訊協定詳細資料的詳細資料, (稱為 HTTP 變數) 和屬於每個網頁要求一部分的值。
HTTP 執行時間資訊。 本節提供您網頁執行所在的 Microsoft .NET Framework版本、路徑、快取詳細資料等的詳細資料。 (如您在使用 Razor 語法 ASP.NET Web 程式設計簡介中所學到,使用 Razor 語法 ASP.NET Web Pages是以 Microsoft ASP.NET Web 服務器技術為基礎建置,其本身是以稱為 .NET Framework.) 的廣泛軟體發展程式庫為基礎
環境變數。 本節提供網頁伺服器上所有本機環境變數及其值的清單。
所有伺服器和要求資訊的完整描述已超出本文的範圍,但您可以看到
ServerInfo
協助程式會傳回許多診斷資訊。 如需傳回之值ServerInfo
的詳細資訊,請參閱 MSDN 網站上的 Microsoft TechNet 網站上的 辨識環境變數 和 IIS 伺服器變數 。
內嵌輸出運算式以顯示頁面值
另一種查看程式碼中發生狀況的方式,就是在頁面中內嵌輸出運算式。 如您所知,您可以藉由將類似 @myVariable
或 @(subTotal * 12)
的內容新增至頁面,直接輸出變數的值。 若要進行偵錯,您可以將這些輸出運算式放在程式碼中的策略點。 這可讓您在頁面執行時查看索引鍵變數的值或計算結果。 當您完成偵錯時,您可以移除運算式或將它們標記為批註。此程式說明使用內嵌運算式來協助偵錯頁面的一般方式。
建立名為 OutputExpression.cshtml的新 WebMatrix 頁面。
以下列內容取代頁面內容:
<!DOCTYPE html> <html> <head> <title></title> </head> <body> @{ var weekday = DateTime.Now.DayOfWeek; // As a test, add 1 day to the current weekday. if(weekday.ToString() != "Saturday") { // If weekday is not Saturday, simply add one day. weekday = weekday + 1; } else { // If weekday is Saturday, reset the day to 0, or Sunday. weekday = 0; } // Convert weekday to a string value for the switch statement. var weekdayText = weekday.ToString(); var greeting = ""; switch(weekdayText) { case "Monday": greeting = "Ok, it's a marvelous Monday."; break; case "Tuesday": greeting = "It's a tremendous Tuesday."; break; case "Wednesday": greeting = "Wild Wednesday is here!"; break; case "Thursday": greeting = "All right, it's thrifty Thursday."; break; case "Friday": greeting = "It's finally Friday!"; break; case "Saturday": greeting = "Another slow Saturday is here."; break; case "Sunday": greeting = "The best day of all: serene Sunday."; break; default: break; } } <h2>@greeting</h2> </body> </html>
此範例會使用
switch
語句來檢查變數的值weekday
,然後根據變數的星期幾顯示不同的輸出訊息。 在此範例中,if
第一個程式碼區塊內的 區塊會藉由將一天新增至目前的工作日值,任意變更一周的日期。 這是為了說明而引入的錯誤。儲存頁面並在瀏覽器中執行。
頁面會顯示一周錯誤日期的訊息。 一周中的哪一天,您都會在一天之後看到訊息。 雖然在此情況下,您知道訊息為何 (因為程式碼刻意設定不正確的日期值) ,但實際上,通常很難知道程式碼中發生什麼問題。 若要偵錯,您必須瞭解索引鍵物件和變數的值發生什麼情況,例如
weekday
。插入 以新增
@weekday
輸出運算式,如程式碼中批註所指示的兩個位置所示。 這些輸出運算式會在程式碼執行時顯示變數的值。var weekday = DateTime.Now.DayOfWeek; // DEBUG: Display the initial value of weekday. @weekday // As a test, add 1 day to the current weekday. if(weekday.ToString() != "Saturday") { // If weekday is not Saturday, simply add one day. weekday = weekday + 1; } else { // If weekday is Saturday, reset the day to 0, or Sunday. weekday = 0; } // DEBUG: Display the updated test value of weekday. @weekday // Convert weekday to a string value for the switch statement. var weekdayText = weekday.ToString();
在瀏覽器中儲存並執行頁面。
頁面會先顯示一周的實際日期,然後顯示一周中新增一天的更新日期,再顯示語句所產生的
switch
訊息。 兩個變數運算式的輸出 (@weekday
) 天數之間沒有空格,因為您未將任何 HTML<p>
標記新增至輸出;運算式僅供測試之用。現在您可以看到錯誤的位置。 當您第一次在程式碼中顯示
weekday
變數時,會顯示正確的日期。 當您第二次顯示它時,在程式碼中的 區塊之後if
,日期會由一天關閉。 因此,您知道工作日變數的第一個和第二個外觀之間發生什麼事。 如果這是真正的錯誤,這種方法可協助您縮小造成問題的程式碼位置。移除您新增的兩個輸出運算式,並移除變更星期一天的程式碼,以修正頁面中的程式碼。 其餘的完整程式碼區塊看起來像下列範例:
@{ var weekday = DateTime.Now.DayOfWeek; var weekdayText = weekday.ToString(); var greeting = ""; switch(weekdayText) { case "Monday": greeting = "Ok, it's a marvelous Monday."; break; case "Tuesday": greeting = "It's a tremendous Tuesday."; break; case "Wednesday": greeting = "Wild Wednesday is here!"; break; case "Thursday": greeting = "All right, it's thrifty Thursday."; break; case "Friday": greeting = "It's finally Friday!"; break; case "Saturday": greeting = "Another slow Saturday is here."; break; case "Sunday": greeting = "The best day of all: serene Sunday."; break; default: break; } }
在瀏覽器中執行頁面。 這次您會看到針對一周實際日期顯示的正確訊息。
使用 ObjectInfo 協助程式顯示物件值
協助 ObjectInfo
程式會顯示您所傳遞之每個物件的類型和值。 您可以使用它來檢視程式碼中的變數和物件值, (如同您在上一個範例中對輸出運算式所做的) ,以及您可以查看物件的相關資料類型資訊。
開啟您稍早建立的 OutputExpression.cshtml 檔案。
以下列程式碼區塊取代頁面中的所有程式碼:
<!DOCTYPE html> <html> <head> <title></title> </head> <body> @{ var weekday = DateTime.Now.DayOfWeek; @ObjectInfo.Print(weekday) var weekdayText = weekday.ToString(); var greeting = ""; switch(weekdayText) { case "Monday": greeting = "Ok, it's a marvelous Monday."; break; case "Tuesday": greeting = "It's a tremendous Tuesday."; break; case "Wednesday": greeting = "Wild Wednesday is here!"; break; case "Thursday": greeting = "All right, it's thrifty Thursday."; break; case "Friday": greeting = "It's finally Friday!"; break; case "Saturday": greeting = "Another slow Saturday is here."; break; case "Sunday": greeting = "The best day of all: serene Sunday."; break; default: break; } } @ObjectInfo.Print(greeting) <h2>@greeting</h2> </body> </html>
在瀏覽器中儲存並執行頁面。
在此範例中
ObjectInfo
,協助程式會顯示兩個專案:類型。 對於第一個變數,類型為
DayOfWeek
。 針對第二個變數,類型為String
。數值。 在此情況下,因為您已經在頁面中顯示問候語變數的值,所以當您將變數傳遞至
ObjectInfo
時,就會再次顯示此值。對於更複雜的物件,
ObjectInfo
協助程式可以顯示更多資訊,基本上可以顯示所有物件屬性的類型和值。
在 Visual Studio 中使用偵錯工具
如需更完整的偵錯體驗,請使用 Visual Studio。 使用 Visual Studio,您可以在您要檢查的程式程式碼中設定中斷點。
當您測試網站時,執行中的程式碼會在中斷點停止。
您可以檢查變數的目前值,並逐行逐步執行程式碼。
如需在 Visual Studio 中使用整合式偵錯工具對 Razor 頁面 ASP.NET 進行偵錯的資訊,請參閱使用 Visual Studio ASP.NET Web Pages (Razor) 程式設計。
其他資源
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應