ASP.NET Web Pages (Razor) 月臺偵錯簡介

作者:Tom FitzMacken

本文說明在 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 程式會顯示目前的使用者身分識別、提出要求的瀏覽器類型等等。 這類資訊可協助您針對常見問題進行疑難排解。

  1. 建立名為 ServerInfo.cshtml的新網頁。

  2. 在頁面結尾處,緊跟在結尾 </body> 標記之前,新增 @ServerInfo.GetHtml()

    <!DOCTYPE html>
    <html>
        <head>
            <title></title>
        </head>
        <body>
       @ServerInfo.GetHtml()
        </body>
    </html>
    

    您可以在頁面的任何位置新增程式 ServerInfo 代碼。 但是,在結尾新增它將會將其輸出與其他頁面內容分開,這可讓您更容易閱讀。

    注意

    重要 您應該先從網頁移除任何診斷程式代碼,再將網頁移至生產伺服器。 這適用于 ServerInfo 協助程式,以及本文中涉及將程式碼新增至頁面的其他診斷技術。 您不想讓網站訪客查看伺服器名稱、使用者名稱、伺服器上的路徑和類似詳細資料的相關資訊,因為這種類型的資訊對於惡意意圖的人可能很有用。

  3. 儲存頁面並在瀏覽器中執行。

    Debugging-1

    協助 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) 的內容新增至頁面,直接輸出變數的值。 若要進行偵錯,您可以將這些輸出運算式放在程式碼中的策略點。 這可讓您在頁面執行時查看索引鍵變數的值或計算結果。 當您完成偵錯時,您可以移除運算式或將它們標記為批註。此程式說明使用內嵌運算式來協助偵錯頁面的一般方式。

  1. 建立名為 OutputExpression.cshtml的新 WebMatrix 頁面。

  2. 以下列內容取代頁面內容:

    <!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 第一個程式碼區塊內的 區塊會藉由將一天新增至目前的工作日值,任意變更一周的日期。 這是為了說明而引入的錯誤。

  3. 儲存頁面並在瀏覽器中執行。

    頁面會顯示一周錯誤日期的訊息。 一周中的哪一天,您都會在一天之後看到訊息。 雖然在此情況下,您知道訊息為何 (因為程式碼刻意設定不正確的日期值) ,但實際上,通常很難知道程式碼中發生什麼問題。 若要偵錯,您必須瞭解索引鍵物件和變數的值發生什麼情況,例如 weekday

  4. 插入 以新增 @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();
    
  5. 在瀏覽器中儲存並執行頁面。

    頁面會先顯示一周的實際日期,然後顯示一周中新增一天的更新日期,再顯示語句所產生的 switch 訊息。 兩個變數運算式的輸出 (@weekday) 天數之間沒有空格,因為您未將任何 HTML <p> 標記新增至輸出;運算式僅供測試之用。

    Debugging-2

    現在您可以看到錯誤的位置。 當您第一次在程式碼中顯示 weekday 變數時,會顯示正確的日期。 當您第二次顯示它時,在程式碼中的 區塊之後 if ,日期會由一天關閉。 因此,您知道工作日變數的第一個和第二個外觀之間發生什麼事。 如果這是真正的錯誤,這種方法可協助您縮小造成問題的程式碼位置。

  6. 移除您新增的兩個輸出運算式,並移除變更星期一天的程式碼,以修正頁面中的程式碼。 其餘的完整程式碼區塊看起來像下列範例:

    @{
        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; 
        }
    }
    
  7. 在瀏覽器中執行頁面。 這次您會看到針對一周實際日期顯示的正確訊息。

使用 ObjectInfo 協助程式顯示物件值

協助 ObjectInfo 程式會顯示您所傳遞之每個物件的類型和值。 您可以使用它來檢視程式碼中的變數和物件值, (如同您在上一個範例中對輸出運算式所做的) ,以及您可以查看物件的相關資料類型資訊。

  1. 開啟您稍早建立的 OutputExpression.cshtml 檔案。

  2. 以下列程式碼區塊取代頁面中的所有程式碼:

    <!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>
    
  3. 在瀏覽器中儲存並執行頁面。

    Debugging-4

    在此範例中 ObjectInfo ,協助程式會顯示兩個專案:

    • 類型。 對於第一個變數,類型為 DayOfWeek 。 針對第二個變數,類型為 String

    • 數值。 在此情況下,因為您已經在頁面中顯示問候語變數的值,所以當您將變數傳遞至 ObjectInfo 時,就會再次顯示此值。

      對於更複雜的物件, ObjectInfo 協助程式可以顯示更多資訊,基本上可以顯示所有物件屬性的類型和值。

在 Visual Studio 中使用偵錯工具

如需更完整的偵錯體驗,請使用 Visual Studio。 使用 Visual Studio,您可以在您要檢查的程式程式碼中設定中斷點。

設定中斷點

當您測試網站時,執行中的程式碼會在中斷點停止。

觸達中斷點

您可以檢查變數的目前值,並逐行逐步執行程式碼。

請參閱值

如需在 Visual Studio 中使用整合式偵錯工具對 Razor 頁面 ASP.NET 進行偵錯的資訊,請參閱使用 Visual Studio ASP.NET Web Pages (Razor) 程式設計。

其他資源