IIS 7.0 以降のバージョンでホストされている Web サイトにアクセスするときのエラー メッセージ: HTTP エラー 404.17 - 見つかりません

この記事は、インターネット インフォメーション サービス (IIS) 7.0 以降のバージョンでホストされている Web サイトにアクセスするときに、 HTTP エラー 404.17 - 見つからない 問題を解決するのに役立ちます。

元の製品バージョン:インターネット インフォメーション サービス
元の KB 番号: 2019689

現象

IIS 7.0 以降のバージョンでホストされている Web サイトがあります。 Web ブラウザーを使用して Web サイト内の動的コンテンツを参照すると、次のようなエラー メッセージが表示されることがあります。

エラーの概要
HTTP エラー 404.17 - 見つかりません
要求されたコンテンツはスクリプトと見なされ、静的ファイル ハンドラーによって処理されません。
詳細なエラー情報:

モジュール StaticFileModule
Notification ExecuteRequestHandler
Handler 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 リソースが、モードで実行されていない、32 ビットではない、または 2.0 バージョンの.NET Frameworkを実行していないアプリケーション プールでClassic処理された場合、404.17 エラーが返されます。 この例でリソースを正しく処理するには、3 つの事前条件がすべて満たされている必要があります。 具体的には、このリソースをホストするアプリケーション プールを Mode 用Classicに構成する必要があり、2.0 バージョンの.NET Frameworkを使用するように構成する必要があり、32 ビット アプリケーションに設定する必要があります。

解決方法

この問題を解決するには、ハンドラーに設定されているすべての事前条件を満たすように、アプリケーションをホストするアプリケーション プールを構成します。

  1. IIS マネージャーを開く

  2. コンピューター名を展開し、左側のウィンドウで [ アプリケーション プール ] をクリックします。

  3. 中央のウィンドウでリソースをホストしているアプリケーション プールを強調表示します。

  4. 右端のウィンドウで、[詳細設定]をクリックします 。..

  5. カテゴリ (全般) の [ 詳細設定 ] ダイアログで、ハンドラーの要件に合わせて次の設定を構成します。

    • .NET Framework バージョン
    • 32 ビット アプリケーションを有効にする
    • マネージド パイプライン モード

詳細

このセクションの情報は、エラーで説明した Web サイトとアプリケーション用に構成されているハンドラーを特定し、そのハンドラー用に構成された事前条件を特定するのに役立ちます。

Appcmd.exe コマンド

次のコマンドを使用して、エラーの出力に記載されている Web サイト用に構成されたハンドラーを識別できます。

アプリケーション プールを一覧表示する

次のコマンドは、アプリケーションが実行されているアプリケーション プールを特定し、そのアプリケーション プール用に構成された前提条件を一覧表示する方法を示しています。

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)

ハンドラーを一覧表示する

このコマンドは、既定の Web サイト内の特定のアプリケーション用に構成されたハンドラーを出力します。

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. 2 つのファイルを含むディレクトリを作成します。

    • コンテンツを使用した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. これら 2 つのファイルを含むディレクトリを指す IIS 7.0 以降のバージョンのアプリケーションを作成します。

  3. 統合モード用に構成されたアプリケーション プールで実行するように新しいアプリケーションを構成します。

  4. [test.aspx] を参照します。