如何解决浏览ASP网页时IIS7出现404.17错误
症状:
用户报告在Windows2008 64位系统上浏览ASP页面时出现404.17的问题。如果重装IIS服务,问题就不会再出现,但是在安装了SMS(System Management Server)后,同样问题又会出现:
需要检查的东西:
1. 启用IIS7的Failed Request Tracing log功能来检查具体的报错信息。这个案例中的报错信息如下所示:
-MODULE_SET_RESPONSE_ERROR_STATUS
ModuleName StaticFileModule
Notification 128
HttpStatus 404
HttpReason Not Found
HttpSubStatus 17
ErrorCode 2147942450
ConfigExceptionInfo
Notification EXECUTE_REQUEST_HANDLER
ErrorCode The request is not supported. (0x80070032)
这个错误信息是在告诉用户没有ASP handler来处理请求,所以最后一个模块-StaticFileModule处理.asp的请求时候,以"not supported"结束。
事实上这个错误信息只是在告诉用户这个ASP handler不能正常处理.asp的请求。所以我们还是需要找出真正引起错误的原因。
检查了ApplicationHost.config:
<applicationPools>
<add name="DefaultAppPool" enable32BitAppOnWin64="true" managedPipelineMode="Classic" />
</system.webServer>
<location path="" overrideMode="Allow">
<system.webServer>
<handlers accessPolicy="Read, Script">
<add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="C:\Windows\System32\inetsrv\asp.dll" resourceType="File" preCondition="bitness64" />
可以看到如红色字体标注的,现在IIS是运行在32位的模式下,所以我们应当删除preCondition="bitness64"使得正确的mapping asp.dll.
但是之后在这个删除后,客户反映问题仍然存在。
在Windows2008使用了Process Monitor来追踪ASP.dll的装载进程,发现,IIS工作进程是在32位的模式下运行,但是装载的是C:\Windows\SysWOW64\inetsrv\asp.dll而并非是C:\Windows\System32\ inetsrv\asp.dll。因为32位的IIS工作进程所需要的是32位的ASP.dll. 所以我们建议做如下改动:
<add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="C:\Windows\SysWOW64\inetsrv\asp.dll" resourceType="File" />
最后一点也是最重要的一点,在IIS7中,IIS配置不仅保存在ApplicationHost.config里面,而且也存在于相应web Application中的web.config里面。所以不要忘记检查web.config以确认ASP handler在web.config中被定义。
更多信息:
默认情况下,ASP handler的配置如下:
<add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor ="%windir%\system32\inetsrv\asp.dll" resourceType="File" />
这就是为什么工作进程能够顺利地在32位和64位之间转换。
谢谢!
微软Internet开发者支持小组