访问 IIS 7.0 或更高版本上托管的网站时出现错误消息:HTTP 错误 404.17 - 找不到

本文可帮助你解决在 Internet Information Services (IIS) 7.0 或更高版本上托管的网站时出现的 HTTP 错误 404.17 - 找不到 问题。

原始产品版本: Internet 信息服务
原始 KB 编号: 2019689

症状

你有一个托管在 IIS 7.0 或更高版本上的网站。 使用 Web 浏览器浏览到网站中的动态内容时,可能会收到类似于以下内容的错误消息:

错误摘要
HTTP 错误 404.17 - 找不到
请求的内容似乎是脚本,不会由静态文件处理程序提供。
详细的错误信息:

Module StaticFileModule
Notification ExecuteRequestHandler
Handler StaticFile
错误代码0x80070032

请求的 URL http://iisserver:80/page.aspx
物理路径 C:\inetpub\wwwroot\page.aspx
登录方法匿名
匿名登录用户

原因

发生此错误的原因是,配置为处理请求的 HTTP 处理程序设置了某些前置条件,但其应用程序池不满足这些先决条件中的部分或全部先决条件。 这会导致静态文件处理程序用于处理请求。 然后,请求的处理失败并返回 404.17 状态,因为请求是针对动态资源,而不是静态资源。

例如,请考虑以下处理程序映射:

<add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />

在这种情况下,如果从站点请求的 *.aspx 资源在未以模式运行、不是 32 位或未运行 2.0 版本的 .NET Framework 的应用程序池中Classic处理,则返回 404.17 错误。 为了使资源在此示例中正确提供,必须满足所有三个先决条件。 具体而言,托管此资源的应用程序池必须配置为 Classic Mode,需要将其配置为使用 2.0 版本的.NET Framework,并且需要为 32 位应用程序设置它。

解决方案

若要解决此问题,请将托管应用程序的应用程序池配置为满足为处理程序设置的所有先决条件。

  1. 打开 IIS 管理器

  2. 展开计算机名称,然后单击左窗格中的“ 应用程序池 ”。

  3. 突出显示中间窗格中托管资源的应用程序池。

  4. 在最右侧窗格中,单击“ 高级设置...”

  5. 在“ 常规) ”类别 (下的“高级设置”对话框中,配置以下设置以匹配处理程序要求:

    • .NET Framework版本
    • 启用 32 位应用程序
    • 托管管道模式

更多信息

本部分中的信息旨在帮助确定为错误中提到的网站和应用程序配置了哪些处理程序,并帮助确定为该处理程序配置的先决条件。

Appcmd.exe 命令

以下命令可用于标识为错误输出中列出的网站配置的处理程序。

列出应用程序池

以下命令演示如何确定应用程序在哪个应用程序池中运行,然后列出为该应用程序池配置的前置条件。

C:\Windows\System32\inetsrv>appcmd.exe list apps /site.name:"Default Web Site"
APP "Default Web Site/" (applicationPool:DefaultAppPool)

C:\Windows\System32\inetsrv>appcmd.exe list apppools
APPPOOL "DefaultAppPool" (MgdVersion:v2.0,MgdMode:Integrated,state:Started)

列表处理程序

此命令将输出为默认网站中的特定应用程序配置的处理程序。

C:\Windows\System32\inetsrv>appcmd.exe list config "Default Web Site/application" -section:handlers
<system.webServer>
  <handlers accessPolicy="Read, Script">
    <add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
    <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
  </handlers>
</system.webServer>

对于 ASP.NET,可能为 *.aspx 资源配置了许多处理程序。 在某些情况下,可能只需更改处理程序即可匹配运行应用程序的应用程序池。 下面是不同 ASP.NET 2.0 处理程序及其各种先决条件设置的列表。

  • ASP.NET 2.0 集成模式 32/64 位处理程序

    <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG" 
         type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode" />
    
  • ASP.NET 2.0 经典模式 32 位处理程序

    <add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" 
        scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" 
        responseBufferLimit="0" />
    
  • ASP.NET 2.0 经典模式 64 位处理程序

    <add name="PageHandlerFactory-ISAPI-2.0-64" path="*.aspx" verb="GET,HEAD,POST,DEBUG" 
         modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll" 
         preCondition="classicMode,runtimeVersionv2.0,bitness64" responseBufferLimit="0" />
    

重现步骤

  1. 创建包含两个文件的目录。

    • 使用内容Test.aspx<%Response.Write("Hello World")%>

    • Web.config 内容:

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
          <system.webServer>
              <httpRedirect enabled="false" destination="http://TestSite" exactDestination="false" childOnly="false" httpResponseStatus="Permanent" />
              <security>
              </security>
              <handlers>
                  <clear/>
                  <add name="PageHandlerFactory-ISAPI-2.0" path="*.aspx" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv2.0,bitness32" responseBufferLimit="0" />
                  <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
              </handlers>
          </system.webServer>
          <system.web>
              <authentication mode="Windows">
                  <forms cookieless="UseCookies" />
              </authentication>
          </system.web>
      </configuration>
      
  2. 使用这两个文件创建指向目录的 IIS 7.0 或更高版本应用程序。

  3. 将新应用程序配置为在为集成模式配置的应用程序池中运行。

  4. 浏览到 test.aspx