How to troubleshooting 404.17 error on IIS7 server while browsing ASP page

English Version

 

中文版

How to troubleshoot 404.17 error on IIS 7

 

Background:

 

Customer reported 404.17 problem while browsing ASP pages on the Windows2008 64bit machine. Very interesting, the problem does not occur if we reinstalled the IIS service completely. However, after installing SMS (System Management Server), the problem appeared again.

 

What to Check:

 

1 Enable IIS7 Failed Request Tracing log to check the detailed error message. In this case, the error message is:

-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)

                       

This error message means there is no ASP handler to process the .asp request. So the last module - StaticFileModule tried to handle .asp request and failed with “not supported” finally.

Actually this error message just tells us the ASP handler doesn’t handle the .asp request as expected. We need to find out “why” by ourselves.

2 I checked the ApplicationHost.config and the following lines has my attention:

<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" />

 

As you see , currently the IIS working process is running under 32bit mode, so we should remove the definition preCondition="bitness64" here for asp.dll mapping.

However, the problem persisted on customer side after removing the definition preCondition="bitness64" for ASP handler.

 

3 I used Process Monitor to trace ASP.dll loading process on my good test Windows2008. It is found that if the IIS working process is running under 32bit mode, it is actually the file C:\Windows\SysWOW64\inetsrv\asp.dll being loaded, not C:\Windows\System32\inetsrv\asp.dll. This is expected as 32bit ASP.dll is required for 32bit IIS working process. So we suggested changing to the following settings instead:

<add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="C:\Windows\SysWOW64\inetsrv\asp.dll" resourceType="File" />

4 Last but most important, in IIS7, IIS configuration is not only saved in ApplicationHost.config but also existed in web.config of the related web application. Please don’t forget to check the web.config to make sure ASP handler also being defined as expected.

Further Information:

By default, the ASP handler is configured as:

<add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="File" />

That’s why the working process could be switched between 32bit and 64bit mode smoothly.

Regards,

Yongkang Chen

 

 

如何解决浏览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位之间转换。

 

Regards,

Yongkang Chen