如何解决浏览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开发者支持小组