本教程也适用于 ASP.NET 网页 2。 可以使用 WebMatrix 3,但不支持集成调试器。
排查代码中的错误和问题的一个重要方面是首先避免它们。 可以通过将可能导致错误的代码部分放入块中
try/catch
来执行此操作。 有关详细信息,请参阅
使用 Razor 语法 ASP.NET Web 编程简介
中有关处理错误的部分。
帮助
ServerInfo
程序是一种诊断工具,可让你大致了解托管页面的 Web 服务器环境的信息。 它还显示浏览器请求页面时发送的 HTTP 请求信息。 帮助
ServerInfo
程序显示当前用户标识、发出请求的浏览器类型等。 此类信息可以帮助你排查常见问题。
创建名为
ServerInfo.cshtml
的新网页。
在页面末尾的结束
</body>
标记之前,添加
@ServerInfo.GetHtml()
:
<!DOCTYPE html>
<title></title>
</head>
@ServerInfo.GetHtml()
</body>
</html>
可以在页面的 ServerInfo
任意位置添加代码。 但将其添加到末尾会使其输出与其他页面内容分开,从而使其更易于阅读。
重要 在将网页移动到生产服务器之前,应从网页中删除任何诊断代码。 这适用于 ServerInfo
帮助程序以及本文中涉及将代码添加到页面的其他诊断技术。 您不希望网站访问者看到有关您的服务器名称、用户名、服务器上的路径以及类似详细信息的信息,因为这种类型的信息可能对具有恶意意图的用户有用。
保存页面并在浏览器中运行它。
帮助 ServerInfo
程序在页面中显示四个信息表:
服务器配置。 本部分提供有关托管 Web 服务器的信息,包括计算机名称、正在运行 ASP.NET 的版本、域名和服务器时间。
ASP.NET 服务器变量。 本部分提供有关许多 HTTP 协议详细信息的详细信息, (称为 HTTP 变量) 以及每个网页请求的一部分的值。
HTTP 运行时信息。 本部分提供了有关运行网页的 Microsoft .NET Framework版本、路径、缓存详细信息等的详细信息。 (如使用 Razor 语法 ASP.NET Web 编程简介中所述,使用 Razor 语法 ASP.NET 网页基于 Microsoft ASP.NET Web 服务器技术构建,该技术本身基于名为 .NET Framework.)
环境变量。 本部分提供 Web 服务器上所有本地环境变量及其值的列表。
所有服务器和请求信息的完整说明超出了本文的范围,但可以看到 ServerInfo
帮助程序返回了大量诊断信息。 有关返回的值 ServerInfo
的详细信息,请参阅 Microsoft TechNet 网站上的 已识别环境变量 和 MSDN 网站上的 IIS 服务器变量 。
嵌入输出表达式以显示页面值
查看代码中发生的情况的另一种方法是在页面中嵌入输出表达式。 如你所知,可以通过向页面添加类似于 @myVariable
或 @(subTotal * 12)
的内容来直接输出变量的值。 对于调试,可以将这些输出表达式放置在代码中的战略点。 这使你可以在页面运行时查看键变量的值或计算结果。 完成调试后,可以删除表达式或将其注释掉。此过程说明了使用嵌入表达式帮助调试页面的典型方法。
创建名为 OutputExpression.cshtml 的新 WebMatrix 页。
将页面内容替换为以下内容:
<!DOCTYPE html>
<title></title>
</head>
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
,一天将休息一次。 因此,你知道在工作日变量的第一次和第二次出现之间发生了一些事情。 如果这是一个真正的 bug,这种方法将帮助你缩小导致问题的代码的位置。
通过删除添加的两个输出表达式并删除更改星期日期的代码,修复页面中的代码。 剩余的完整代码块如以下示例所示:
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>
<title></title>
</head>
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
。
值。 在这种情况下,由于已在页面中显示 greeting 变量的值,因此将变量传递给 ObjectInfo
时会再次显示该值。
对于更复杂的对象, ObjectInfo
帮助程序可以显示更多信息, 基本上,它可以显示对象的所有属性的类型和值。
若要获得更全面的调试体验,请使用 Visual Studio。 使用 Visual Studio,可以在代码中设置要检查的行的断点。
测试网站时,执行的代码会在断点处停止。
可以检查变量的当前值,并逐行执行代码。
有关在 Visual Studio 中使用集成调试器调试 ASP.NET Razor 页面的信息,请参阅使用 Visual Studio ASP.NET 网页 (Razor) 编程。
使用 Visual Studio ASP.NET 网页 (Razor) 编程
IIS 服务器变量 (MSDN)
TechNet) (识别的环境变量