在 IIS 上托管的 ASP.NET 应用程序调试






4.87/5 (116投票s)
本文介绍如何在 IIS 上调试已托管的 Web 应用程序。它还介绍了在多个工作进程运行时如何选择正确的进程进行附加。
目录
概述
通常,我们通过 Visual Studio 调试 ASP.NET Web 应用程序。Visual Studio 拥有自己的 ASP.NET 引擎,足以在 Visual Studio 内部运行和调试您的网站。但是,如果您的网站托管在 IIS 上,并且您想直接调试该网站,您将如何进行调试?当我们把网站托管在 IIS 上时,工作进程 (w3wp.exe) 用于运行 Web 应用程序。我们需要从 Visual Studio 附加到这个特定的进程来调试 Web 应用程序。本文介绍了使用此方法调试应用程序的整体思路。它还介绍了工作进程、应用程序池以及如何使用 iisapp.vbs
选择一个特定进程,如果 IIS 上有多个工作进程正在运行。希望您会喜欢这篇文章,并提出宝贵的建议和反馈。
ASP.NET 调试与 IIS 调试
Visual Studio 拥有自己的集成调试引擎,可以在我们从 Visual Studio 运行应用程序时调试代码。如果我们正在开发一个网站并且需要调试代码,我们只需设置断点并进行调试(注意:本文不介绍如何设置调试模式)。
当我们运行应用程序时,执行会在达到某个断点时中断。这非常简单,因为当 ASP.NET 应用程序在 Visual Studio 中运行时,它由集成到 Visual Studio 中的ASP.NET 引擎控制。如果您想检查哪个进程正在运行以进行调试,请从 Visual Studio 运行 Web 应用程序:您将收到一个弹窗通知,如下所示。
这表明一个进程正在启动以运行 ASP.NET 应用程序。双击该图标,将弹出一个窗口显示详细信息。
正在运行的进程背后是WebDev.WebServer.exe。当我们按 F5 运行应用程序时,此进程开始执行它。如果您想从命令提示符运行应用程序,您需要执行以下步骤。
从命令提示符运行 Web 应用程序的步骤
- 打开 Visual Studio 命令提示符
- 运行 WebDev.WebServer
会出现以下屏幕。请查看其中的示例部分。
现在回到 IIS 调试。当我们部署或托管网站时,IIS 就派上用场了。将网站部署到 IIS 后,如果想在那里调试网站,我们不能像在 Visual Studio 中那样直接进行。IIS 有自己的工作进程,负责所有已部署 Web 应用程序的执行和维护。我将在后面的部分详细介绍工作进程。因此,如果我们有一个正在 IIS 中运行的进程,并且需要调试应用程序,首先我们必须从 Visual Studio 附加到正确的进程。在进行描述之前,让我们先了解一下工作进程和应用程序池。
什么是工作进程?
工作进程 (w3wp.exe) 在 IIS 中运行 ASP.NET 应用程序。所有 ASP.NET 功能都在工作进程的范围内运行。当服务器从客户端接收到请求时,工作进程负责生成请求和响应。它还维护进程内会话数据。如果我们回收工作进程,我们将丢失其状态。有关更多信息,请阅读本文:ASP.NET 架构的底层视图
应用程序池
这是您在生产环境中为自己的应用程序应该创建的最重要的事情之一。应用程序池用于分隔共享相同配置的 IIS 工作进程集。应用程序池使我们能够隔离 Web 应用程序,以提高安全性、可靠性和可用性。工作进程充当进程边界,分隔每个应用程序池,以便当一个工作进程或应用程序出现问题或被回收时,其他应用程序或工作进程不受影响。
默认应用程序池
IIS 6.0 的默认应用程序名称是DefaultAppPool。将网站托管到 IIS 后,如果我们检查虚拟目录的属性,我们可以按如下方式查看该信息。
- 开始菜单 → 运行命令 →
inetmgr
- 展开DefaultWebSites或您创建了虚拟目录的其他 Web 网站
- 右键单击虚拟目录
- 单击属性
将出现以下虚拟目录属性屏幕,显示分配给所选网站的应用程序池名称。
如果您想查看 IIS 中所有应用程序池的列表,您需要展开 IIS 服务器上的应用程序池节点。
现在,每个应用程序池都应该至少有一个工作进程,负责处理与应用程序池关联的网站的运行。右键单击应用程序池 → 转到性能选项卡,检查选项卡底部的Web 场部分,默认情况下,工作进程数为 1。包含多个工作进程的应用程序池称为Web 场。
创建和分配应用程序池
- 打开 IIS 控制台,右键单击应用程序池文件夹,选择新建图 8-1
- 输入应用程序池 ID,然后单击确定。图 8-2
- 现在,右键单击虚拟目录,并将新创建的应用程序池分配给该虚拟目录。图 8-3
现在,此网站将在StateServerAppPool中独立运行,因此与其他应用程序相关的问题不会影响此应用程序。这是创建单独应用程序池的主要优点。
如何开始?
到目前为止我所说的内容为您提供了对工作进程和应用程序池的良好理解。在继续进行下一部分之前,您应该对它们有清晰的理解。现在我将向您展示如何在 IIS 服务器上托管的网站上进行调试。
为演示起见,我创建了一个名为SampleWebSite的网站并将其托管到我的本地 IIS 上。以下是默认页面的输出。
附加到哪个进程?
现在,正如我之前解释过的,进程名称是w3wp.exe,所以我们可以从任务管理器中检查工作进程是否正在运行。
现在我们要附加到进程。在 Visual Studio 中,转到调试 → 附加到进程
单击附加到进程后,将出现以下屏幕
现在我们可以看到工作进程正在运行,并且我们需要附加到该进程。选择进程,然后单击附加按钮。之后,查看下面的两张图片
您注意到断点符号了吗?如果工作进程成功附加,代码中的断点符号将是一个实心圆。否则,它将显示一个警告图标,如所示。对于单个工作进程,这种情况并不常见。但是,当 IIS 上运行多个工作进程时,我们可能会感到困惑。我将在后面的部分讨论这个问题。
现在,如果我们成功附加到进程后单击调试按钮,执行将在断点处停止。
接下来,让我们看看当有多个工作进程运行时应该怎么做。
如何附加到多个正在运行的工作进程之一
现在,这种情况何时会出现?当我们有多个网站托管在 IIS 上,并且这些网站有自己的应用程序池。现在,多个应用程序池意味着有多个工作进程正在运行。
这里我的 IIS 中有三个应用程序池。它们是
- 默认应用程序池
- 通用应用程序池
- 状态服务器应用程序池
现在,我的SampleWebSite与DefaultAppPool相关联。现在,我想附加进程来调试我的SampleWebSite。按照之前的步骤操作。打开进程附加窗口
只看一眼,有三个工作进程正在运行,您必须附加其中一个。但是,您不知道哪个工作进程是默认应用程序池的。您所做的是,随意选择其中一个,比如说进程 ID 为 4308 的进程,并假设它不是默认应用程序池的工作进程。那么,如果您附加到错误的进程会发生什么?查看下面的图片
获取正在运行的工作进程列表
那么,前一种情况的解决方案是什么?这是一个快速技巧
- 开始 → 运行命令 → cmd
- 切换目录到 \Windows\System32
- 运行命令:
cscript iisapp.vbs
然后等待输出。哇!您得到了一个正在运行的工作进程、进程 ID 和应用程序池名称列表!
附加到正确的进程
您可以在此处轻松识别正确的应用程序池名称及其进程 ID。现在,返回 Visual Studio → 附加进程。现在您知道默认应用程序池的进程 ID 是 1772
,因此请附加到该进程。
现在,尽情调试吧!
摘要
有时我们需要调试已托管在 IIS 上的应用程序。为此,我们需要将正在运行的工作进程附加到 Visual Studio。如果我们有多个工作进程在 IIS 服务器上运行,我们可以使用命令 cscript iisapp.vbs
来识别合适的工作进程。
希望本文能帮助仍在使用 IIS 上托管的应用程序调试的初学者。请提供您的反馈和建议以改进本文。
谢谢。