當您造訪裝載於 IIS 7.0 或更新版本的網站時發生錯誤訊息:HTTP 錯誤 404.17 - 找不到

本文可協助您解決當您造訪 Internet Information Services (IIS) 7.0 或更新版本上裝載的網站時的 HTTP 錯誤 404.17 - 找不到 問題。

原始產品版本: Internet Information Services
原始 KB 編號: 2019689

徵狀

您有一個裝載於 IIS 7.0 或更新版本的網站。 當您使用網頁瀏覽器瀏覽至網站中的動態內容時,可能會收到類似下列的錯誤訊息:

錯誤摘要
HTTP 錯誤 404.17 - 找不到
要求的內容看起來是腳本,而且不會由靜態檔案處理程式提供。
詳細的錯誤資訊:

Module StaticFileModule
通知 ExecuteRequestHandler
處理程式 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 資源是在未以Classic模式執行的應用程式集區中處理、不是 32 位或未執行 2.0 版的 .NET Framework,則會傳回 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