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

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

原始产品版本: Internet Information Services
原始 KB 数: 2019689

现象

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

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

Module StaticFileModule
Notification ExecuteRequestHandler
处理程序 StaticFile
错误代码0x80070032

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

原因

发生此错误的原因是配置为处理请求的 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 资源在未在模式下运行Classic、不是 32 位或未运行 .NET Framework 的 2.0 版本的应用程序池中处理,则返回 404.17 错误。 为了使资源在此示例中得到正确处理,必须满足所有三个先决条件。 具体而言,托管此资源的应用程序池必须配置为 Classic Mode,需要将其配置为使用 .NET Framework 的 2.0 版本,并且需要为 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