IIS 7 no sirve páginas .aspx pero funciona con archivos predeterminados

IIS 7 no sirve páginas .aspx pero funciona con archivos predeterminados

Implementé un sitio web ASP.NET 4 en IIS 7 en Windows Server 2008. Cuando busco la carpeta raíz o cualquier otra carpeta del sitio, el servidor responde entregando la página predeterminada Default.aspxcomo era de esperar. Sin embargo, cuando solicito una página específica con una .aspxextensión, aparece un error 404.

Por ejemplo, cuando solicito:

http://localhost/MyWeb/

el servidor entrega exitosamente http://localhost/MyWeb/Default.aspx. Sin embargo, si solicito explícitamente:

http://localhost/MyWeb/Default.aspx

entonces IIS responde con un error 404.

Los detalles del error son los siguientes:

Module: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error code: 0x80070002

Obviamente, el marco .NET está instalado y funcionando, ya que puedo acceder a las páginas predeterminadas. Por cierto, he observado que cuando el servidor falla y muestra una página de error 404, la URL que ingresé (como http://localhost/MyWeb/Default.aspx) elimina la extensión (y dice http://localhost/MyWeb/Default).

Intenté ejecutar aspnet_iisreg -iy reiniciar el servidor, pero las cosas no han cambiado.

¿Qué me estoy perdiendo? Gracias.

ACTUALIZAR. Estoy publicando aquí el web.configde mi sitio. No hay otros archivos de configuración que se le apliquen.

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>

  <appSettings>
    <add key="DatabaseServer" value="CONWAY\SQLEXPRESS"/>
    <add key="DatabaseName" value="KaleidoScape"/>
    <add key="User" value="KaleidoScapeUser"/>
    <add key="Password" value="Scape1!"/>
  </appSettings>

  <system.web>

    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />

    <pages>
      <namespaces>
        <add namespace="System.Web.Optimization" />
      </namespaces>
      <controls>
        <add assembly="Microsoft.AspNet.Web.Optimization.WebForms" namespace="Microsoft.AspNet.Web.Optimization.WebForms" tagPrefix="webopt" />
        <add tagPrefix="uc" tagName="FileGallery" src="~/Controls/FileGallery/FileGallery.ascx" />
      </controls>
    </pages>

    <authentication mode="Forms">
      <forms defaultUrl="~/App" loginUrl="~/Default.aspx" slidingExpiration="true" timeout="120" name="Incipit.KaleidoScape" />
    </authentication>

    <authorization>
      <allow users="*" />
    </authorization>

  </system.web>

  <location path="App">
    <system.web>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
  </location>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" culture="neutral" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>      
    </assemblyBinding>
  </runtime>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
</configuration>

ACTUALIZAR. Las entradas del registro de IIS para una solicitud fallida son las siguientes:

2016-10-23 21:13:22 127.0.0.1 GET /MyWeb/MyPage.aspx - 80 - 127.0.0.1 Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.0;+WOW64;+Trident/5.0) 301 0 0 46
2016-10-23 21:13:22 127.0.0.1 GET /MyWeb/MyPage - 80 - 127.0.0.1 Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.0;+WOW64;+Trident/5.0) 404 0 2 0

Tenga en cuenta que hay dos entradas. El primero corresponde a MyPage.aspx, que es la página que solicité escribiendo en el campo URL. Esto da como resultado un error 301 (movido permanentemente). Inmediatamente después, hay una entrada para la misma página sin la .aspxextensión, lo que resulta en un error 404 con subestado 0. No entiendo por qué la URL completa obtiene un 301 y por qué el servidor intenta entregar (y falla). una página sin la extensión.

ACTUALIZAR. Acabo de realizar un experimento interesante. Creé una nueva aplicación web en mi servidor, con un solo Test.aspxarchivo. Funcionó como se esperaba, es decir, el servidor entrega la página cuando la solicita explícitamente. Luego copié todo el contenido del sitio web que me está dando dolores de cabeza, ¡y Test.aspxdejé de funcionar! Luego, eliminé todo de esta web excepto el Test.aspxarchivo, y no volvió a funcionar, pero siguió fallando. En conclusión, hay algo en el contenido web que arruina las cosas y que persiste después de eliminar el contenido. Este es un sitio web que creé con Visual Studio 2015 usando una plantilla de proyecto que viene con Bootstrap y algunas cosas más. Estoy completamente confundido.

Respuesta1

Después de mucha investigación, encontré una solución a esto. Debo decir que sé cómo solucionar el problema, pero todavía no estoy seguro de por qué ocurre.

El problema está relacionado con el mecanismo de "URL amigables" que está disponible en IIS 7. Las desactivé cambiando el código de App_Start\RouteConfig.cs:

var settings = new FriendlyUrlSettings();
settings.AutoRedirectMode = RedirectMode.Permanent;
routes.EnableFriendlyUrls(settings);

a:

var settings = new FriendlyUrlSettings();
settings.AutoRedirectMode = RedirectMode.Off;
routes.EnableFriendlyUrls(settings);

Esto ha solucionado el problema. Hasta donde tengo entendido, las URL amigables tratan de eliminar extensiones de archivos, y supongo que es por eso que recibo el error 301 y un intento posterior de obtener un archivo sin extensión cada vez que solicito una página. Sin embargo, no sé por qué IIS no entrega el archivo.

De todos modos, ya está arreglado. Gracias a todos los que ayudaron a diagnosticar el problema.

información relacionada