Condividi tramite


Messaggio di errore quando si visita un sito Web ospitato in IIS 7.0 o versioni successive: Errore HTTP 404.17 - Non trovato

Questo articolo consente di risolvere il problema http 404.17 - Non trovato quando si visita un sito Web ospitato in Internet Information Services (IIS) 7.0 o versioni successive.

Versione originale del prodotto: Internet Information Services
Numero KB originale: 2019689

Sintomi

Si dispone di un sito Web ospitato in IIS 7.0 o versioni successive. Quando si passa al contenuto dinamico nel sito Web usando un Web browser, è possibile che venga visualizzato un messaggio di errore simile al seguente:

Riepilogo errori
Errore HTTP 404.17 - Non trovato
Il contenuto richiesto sembra essere script e non verrà gestito dal gestore di file statici.
Informazioni dettagliate sull'errore:

Modulo StaticFileModule
Notification ExecuteRequestHandler
Handler StaticFile
Codice di errore 0x80070032

URL richiesto http://iisserver:80/page.aspx
Percorso fisico C:\inetpub\wwwroot\page.aspx
Metodo di accesso anonimo
Utente di accesso anonimo

Causa

Questo errore si verifica perché il gestore HTTP configurato per gestire la richiesta ha determinate precondizioni impostate, ma il relativo pool di applicazioni non soddisfa alcune o tutte queste precondizioni. In questo modo, il gestore di file statici viene usato per elaborare la richiesta. L'elaborazione della richiesta ha quindi esito negativo e lo stato 404.17 restituito perché la richiesta è per una risorsa dinamica e non una statica.

Si consideri ad esempio il mapping del gestore seguente:

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

In questo caso, viene restituito un errore 404.17 se la risorsa *.aspx richiesta dal sito viene gestita in un pool di applicazioni che non è in esecuzione in Classic modalità, non è a 32 bit o non esegue la versione 2.0 di .NET Framework. Affinché la risorsa venga servita correttamente in questo esempio, è necessario soddisfare tutte e tre le condizioni preliminari. In particolare, il pool di applicazioni che ospita questa risorsa deve essere configurato per Classic la modalità, deve essere configurato per l'uso della versione 2.0 di .NET Framework e deve essere impostato per le applicazioni a 32 bit.

Risoluzione

Per risolvere questo problema, configurare il pool di applicazioni che ospita l'applicazione per soddisfare tutte le condizioni predefinite impostate per il gestore.

  1. Aprire Gestione IIS

  2. Espandere il nome del computer e fare clic su Pool di applicazioni nel riquadro sinistro.

  3. Evidenziare il pool di applicazioni che ospita la risorsa nel riquadro centrale.

  4. Nel riquadro all'estrema destra fare clic su Impostazioni avanzate...

  5. Nella finestra di dialogo Impostazioni avanzate nella categoria (Generale) configurare le impostazioni seguenti in modo che corrispondano ai requisiti del gestore:

    • Versione di .NET Framework
    • Abilitare le applicazioni a 32 bit
    • Modalità pipeline gestita

Ulteriori informazioni

Le informazioni contenute in questa sezione consentono di identificare i gestori configurati per il sito Web e l'applicazione menzionati nell'errore, nonché di identificare le pre-condizioni configurate per tale gestore.

comandi Appcmd.exe

I comandi seguenti possono essere usati per identificare i gestori configurati per il sito Web elencato nell'output dell'errore.

Elencare il pool di applicazioni

I comandi seguenti illustrano come determinare il pool di applicazioni in cui è in esecuzione l'applicazione e quindi elencare le precondizioni configurate per il pool di applicazioni.

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)

Elencare i gestori

Questo comando restituirà i gestori configurati per l'applicazione specifica nel sito Web predefinito.

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>

Nel caso di ASP.NET, potrebbero essere presenti molti gestori configurati per una risorsa *.aspx. In alcuni casi, il gestore potrebbe semplicemente dover essere modificato in modo che corrisponda al pool di applicazioni in cui è in esecuzione l'applicazione. Di seguito è riportato un elenco dei diversi gestori ASP.NET 2.0 con le varie impostazioni di pre-condizione.

  • ASP.NET gestore della modalità integrata 2.0 a 32/64 bit

    <add name="PageHandlerFactory-Integrated" path="*.aspx" verb="GET,HEAD,POST,DEBUG" 
         type="System.Web.UI.PageHandlerFactory" preCondition="integratedMode" />
    
  • gestore della modalità classica ASP.NET 2.0 a 32 bit

    <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 gestore della modalità classica a 64 bit 2.0

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

Passaggi per riprodurre il bug

  1. Creare una directory contenente due file.

    • Test.aspx con il contenuto<%Response.Write("Hello World")%>

    • Web.config con il contenuto:

      <?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. Creare un'applicazione IIS 7.0 o versioni successive che punta alla directory con questi due file.

  3. Configurare la nuova applicazione da eseguire in un pool di applicazioni configurato per la modalità integrata.

  4. Passare a test.aspx.