当 ASP(经典、VBScript)页面上发生错误时,生成的错误消息(如果设置为显示错误响应)以及完整的FREB 日志(如果您已打开)显示已处理的行号发生错误的 ASP 文件。
这非常有用,因为您可以查看文件,找到错误并修复它。或者至少,如果您的 ASP 文件只是一个不包含任何其他文件的文件,则可以。
另一方面,如果您的文件确实有任何<!-- #include -->
包含其他文件的指令,那么事情就不那么有用了。由于 ASP/IIS 包含在文件处理之前发生,因此行号不是磁盘上任何实际文件中的实际行号,而是由复制到主文件中的所有包含文件组成的文件中的行号各自的位置。当你有一个顶部有大约 30 个包含指令的文件,然后你被告知在第 592 行有一个错误,你最终完全不知道该行在哪个物理文件中,你只剩下 30文件,直到找到正确的文件。
不幸的是,据我所知,无法检索有关特定行最初属于哪个文件的信息,因此无法获得完全有用的错误消息版本。
但是服务器至少应该可以提供它实际正在处理的页面的源代码,以便您可以查看它,找到第 592 行并至少知道导致错误的行的内容和上下文是。
我不希望这可以在输出到浏览器的错误消息中提供(这将是一个明显的、巨大的安全漏洞),但它肯定应该很容易包含在包含成千上万的失败请求跟踪中关于文件执行的其他所有细节的行。可悲的是,我还没有找到真正做到这一点的方法。
有没有办法指示 IIS 提供已编译的 ASP 文件(作为纯文本)作为失败请求跟踪的一部分,以便错误消息中的行号实际上有用?
有一种相当简单的方法可以查看 ASP 文件及其包含的组合输入。但仅限于您的开发机器上,而不是您的生产服务器上。
首先以管理员身份在 PowerShell 中安装 Server-Side-Includes:
现在,假设您有一个
/index.asp
包含许多包含的页面。在相同位置复制并index.shtml
在浏览器中调用该 url。现在查看页面的代码(Ctrl+U),你应该看到合并的源代码。
IIS ServerSideIncludes 处理程序包括包含目录中的所有文件,但不运行经典的 ASP 解释器。