¿Porqué mi página web por defecto de ASP.NET Core no se vé en mi Azure Web App y me da un 404?
Estado de situación (el problema)
Es posible que te hayas encontrado con esta situación en alguna ocasión.
Cuando trabajamos en una aplicación desarrollada con ASP.NET Core, ya sea una aplicación Web MVC o una Web API, podemos crear una carpeta wwwroot para incluir allí páginas estáticas.
Por ejemplo, la típica página web por defecto.
Sin embargo, y aunque en local funcione bien, puede ocurrir que cuando desplegamos nuestra aplicación Web en Azure, al acceder al raiz de nuestro sitio, se muestra un error, una respuesta 404 Not Found.
Si acudimos a Azure, veremos dentro de la configuración de nuestra Web App, que en la sección de documentos por defecto, tenemos bien configurada la página por defecto.
Pero el error 404 persiste.
¿Cómo resolvemos este problema?.
¿Qué está ocurriendo?.
Startup.cs tiene la solución
Dentro de la clase Startup.cs, y en concreto en el método Configure, encontraremos la configuración del registro al pipeline.
Un aspecto muy importante aquí, es el orden en el que realizamos el registro.
Tanto es así, que algunos errores muy comunes que no tienen a priori, una explicación lógica, responde únicamente al orden en el que registramos la configuración.
Y es muy probable, que justo eso, es lo que esté pasando en este caso.
De tal forma, que podrías encontrarte en tu código el siguiente código:
app.UseStaticFiles();
app.UseDefaultFiles();
Es decir, UseStaticFiles antes de UseDefaultFiles.
Pues bien, si este es el problema, basta con cambiar tu código poniendo a UseDefaultFiles antes de UseStaticFiles.
app.UseDefaultFiles();
app.UseStaticFiles();
De esta forma, evitarás el problema, y si desplegamos ahora nuestra aplicación, ésta se mostrará tal y como esperamos por defecto.
Pero hay más…
Existe también la posibilidad de usar UseFileServer en lugar de usar las dos anteriores:
app.UseFileServer();
De esta forma, evitaremos la confusión anterior, que aunque parezca raro, es más común de lo que parece.
El uso de esta configuración forma parte de FileServerExtensions.cs, y registra ambas configuraciones en el orden correcto.
Algo más sobre UseDefaultFiles, UseStaticFiles, y UseFileServer
Las tres forman parte de Microsoft.AspNetCore.StaticFiles.
UseDefaultFiles se encarga de servir los ficheros o páginas web por defecto y en el orden (Default.htm, default.html, Index.htm, e Index.html).
UseStaticFiles habilita la posibilidad de servir ficheros estáticos, tanto HTML, como imágenes, etc, todas ellas dentro del directorio wwwroot.
La particularidad de FileServerExtensions.cs, y de usar UseFileServer es que en su código podemos ver lo siguiente:
public static IApplicationBuilder UseFileServer(this IApplicationBuilder app, FileServerOptions options) { if (app == null) { throw new ArgumentNullException(nameof(app)); } if (options == null) { throw new ArgumentNullException(nameof(options)); } if (options.EnableDefaultFiles) { app.UseDefaultFiles(options.DefaultFilesOptions); } if (options.EnableDirectoryBrowsing) { app.UseDirectoryBrowser(options.DirectoryBrowserOptions); } return app.UseStaticFiles(options.StaticFileOptions); }
Si prestamos atención a éste código, veremos que se puede llegar a ejecutar no sólo UseDefaultFiles y UseStaticFiles, sino también UseDirectoryBrowser.
Directory browsing nos permite listar un directorio.
Por defecto y por motivos de seguridad, Directory browsing está deshabilitado.
Para más información sobre todo esto, te recomiendo leer la información oficial que sobre Static Files tiene Microsoft.
Espero que esto te haya servido de ayuda.
Happy Coding!