我已将 ASP.NET 3.5 应用程序部署到 64 位 Windows 2003 R2 服务器。
在 web.config 中我有以下内容
<customErrors mode="RemoteOnly"
defaultRedirect="/404/">
<error statusCode="404"
redirect="/404/"/>
<error statusCode="500"
redirect="/500/"/>
</customErrors>
在 IIS 管理器的网站属性中,我已将 404 和 500 错误设置为 Type =“URL”以及与 web.config 中的相同的 URL。
我有一个通配符应用程序映射到 .NET 2.0 aspnet_isapi.dll,并且“验证文件是否存在”已关闭。
如果我尝试访问一个假的 .aspx 文件,我会被成功发送到 404 页面。我相信这是因为 .aspx 和 .NET DLL 之间存在显式映射。
如果我尝试访问虚假目录,我只会收到一条纯文本响应,内容为:
该系统找不到指定的文件。
看起来这些目录请求没有通过 .NET 管道进行路由,而这正是我所期望(并且需要)由于通配符应用程序映射而发生的。
有任何想法吗?
答案1
为了测试您的逻辑,我实际上完成了整个过程。我使用 IIS 和 ASP.NET 的 ETW 跟踪和进程监视器来查看发生了什么。以下是我发现的情况:
- 当您为 aspnet_isapi.dll 添加“通配符映射”且未选中“验证文件是否存在”时,所有请求实际上都会通过 .net 管道
- 当你访问一个虚假目录时,.net 实际上会查找所有 .config 文件,例如 machine.config、root web.config(位于 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG)和你的网站根目录,以查找可以处理你的请求的可能的 HttpHandler
- 由于没有配置任何处理程序来处理“目录”请求,因此请求会回退
IISGeneral: GENERAL_STATIC_FILE_HANDLER
并失败,0x80070002
即 FILENOTFOUND - 由于您已将 IIS 自定义错误 404 配置为 /404/,它会查找目录 c:\inetpub\wwwroot\404\,并出现另一个失败
0x80070002
并发送一般The system cannot find the file specified.
错误。 - 当您访问虚假的 main.aspx 页面时,.aspx 请求在根 web.config 文件中处理,因此您会看到 .net 特定的(找不到资源。)错误。
- 现在,当您选中“通配符映射”的“验证文件是否存在”时,服务器会在将扩展映射到应用程序之前检查请求的脚本是否存在
- 因此,请求永远不会通过.net管道,并会出现第4点所述的错误。
希望这可以帮助。
答案2
对于 IIS 5.0,成功的途径是:
属性 > 主目录 > 高级配置:选择您感兴趣的文件扩展名,然后选中“验证文件是否存在”复选框。
答案3
如果您有一个通配符映射而没有启用“验证文件是否存在”,它将向 DLL 发送请求。如果您将其映射到的 ASP.Net 2.0 DLL 没有使用 web.config 作为您的应用程序(您提到这是针对 .Net 3.5 的),那么它将返回一个一般错误。如果您启用“验证文件是否存在”选项,IIS 将看到该文件夹不存在,并使用其内部错误设置(您说这些设置与 web.config 中的设置相同)。也许可以尝试打开该选项,看看是否有助于解决您的情况。