Autor en Google+
Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET, ASP.NET Core, MVC, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

10 años online 🎂

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET, ASP.NET Core, MVC, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 12 de abril de 2016
ASP.NET CoreFinalizamos ya la serie sobre el proceso de peticiones a contenidos estáticos en ASP.NET Core, donde hemos visto cómo gestionar peticiones directas a recursos estáticos utilizando el componente StaticFilesMiddleware y cómo permitir la navegación (o browsing) sobre directorios presentes en el sistema de archivos mediante DirectoryBrowerMiddleware.

Sin embargo, el paquete Nuget Microsoft.AspNetCore.StaticFiles aún contiene algunas perlas adicionales que es conveniente conocer para afinar aún más el comportamiento de nuestro servidor de archivos, e incluso para aumentar la productividad a la hora de implementarlo en nuestras aplicaciones.

Hey, pero como siempre, recordad que aún estamos jugando con una versión preliminar de ASP.NET Core, y hay detalles que podrían cambiar antes de alcanzar la versión final del producto.


Documentos por defecto en directorios: introducing DefaultFilesMiddleware

Normalmente cuando introducimos en el navegador la ruta de un directorio, si este contiene un archivo especial denominado archivo por defecto o default document (por ejemplo, index.html), se retorna su contenido en lugar del listado de archivos y carpetas del directorio. En versiones anteriores de ASP.NET, el nombre de los archivos por defecto podíamos configurarlo fácilmente desde IIS o en el web.config, pero con ASP.NET Core, de nuevo la cosa cambia.

Y como hemos visto anteriormente, el middleware DirectoryBrowerMiddleware era capaz de mostrar los archivos y carpetas de un directorio permitiendo la navegación por un sistema de archivos, sin embargo no había ninguna configuración que diera a entender que también podría aplicar documentos por defecto durante ese proceso. Esto es así porque ASP.NET Core proporciona un middleware específico para proporcionar esta funcionalidad:  DefaultFilesMiddleware.

Este middleware observa las peticiones GET o HEAD entrantes cuyo path corresponda con el de un directorio del sistema de archivos, y comprueba si en su interior existe un fichero con el nombre coincidente con algunos de los default documents que le hayamos configurado. Si no es así, el middleware simplemente dejará pasar la petición tal cual, pero si existe el documento por defecto se reescribirá la URL de la petición entrante añadiéndole el nombre de dicho archivo y se dejará continuar su periplo por el pipeline de ASP.NET Core, de forma que un middleware posterior (por ejemplo, StaticFilesMiddleware) la procese.

Es decir, este middleware no retorna el contenido, simplemente reescribe la ruta confiando en que  otro middleware retorne el contenido, por lo que su ubicación en el pipeline debe ser muy temprana, por delante de otros como StaticFilesMiddleware  o DirectoryBrowserMiddleware y siempre añadiendo al menos el primero de ellos para asegurar que el contenido se retorna.

Para utilizarlo, como de costumbre, basta con utilizar el extensor DirectoryBrowserMiddleware sobre la instancia de IApplicationBuilder en la clase de inicialización:
public void Configure(IApplicationBuilder app)
{
    ...
    app.UseDefaultFiles();
    ...
}
En una llamada como la anterior, automáticamente se configurarán como default documents los archivos "default.htm", "default.html", "index.html" e "index.html", que son los valores por defecto.

Pero como también es habitual, a este extensor podemos suministrar un objeto con settings de configuración de tipo DefaultFilesOptions, donde encontramos propiedades como FileProvider , que ya hemos comentado en entregas anteriores que representa al sistema de archivos utilizado por el componente, RequestPath, donde podemos indicar la ruta base sobre la que actuará el middleware, y una lista de nombres de archivo que serán considerados documentos por defecto de las carpetas cuando existan en ellas en la propiedad DefaultFileNames:
app.UseDefaultFiles(new DefaultFilesOptions()
{
    DefaultFileNames = new[] { "home.html", "start.html" }    
});
app.UseDirectoryBrowser();
app.UseStaticFiles();
Un aspecto importante respecto a la propiedad DefaultFileNames es que hay que ser prudente en el orden y número de documentos por defecto que configuremos, puesto que la búsqueda en el sistema de archivos se realiza de forma secuencial y esto podría afectar al rendimiento. Por tanto, mejor si tenemos pocos documentos por defecto, y ordenados de forma que los más probables aparezcan primero.

Archivos estáticos, browsing de directorios, default files… ¿Y si lo necesito todo?

Desde el equipo de ASP.NET Core han considerado que serán frecuentes los escenarios en los que será necesario añadir los tres middleware que hemos visto hasta el momento: StaticFilesMiddleware , DirectoryBrowserMiddleware y DefaultFilesMiddleware, y por esa razón han añadido al paquete el extensor UseFileServer() que, básicamente, viene a decir "quiero un servidor de archivos completo".

Para utilizarlo seguiremos la fórmula habitual:
public void Configure(IApplicationBuilder app)
{
    ...
    app.UseFileServer();
    ...
}
La llamada anterior introducirá en el pipeline, en este orden, los middlewares DefaultFilesMiddleware, DirectoryBrowserMiddleware
por lo que simplemente es una forma más rápida de hacer lo que estamos viendo en esta serie de posts, aunque aún podemos afinar este comportamiento mediante un parámetro de tipo FileServerOptions en el que podemos indicar aspectos como:
UseFileServer
  • si habilitamos o no el middleware para los documentos por defecto,
  • si habilitamos o no el browsing de directorios,
  • y otros parámetros comunes, como el sistema de archivos o el path base para las peticiones.

Y ahora sí, creo que ya sabemos todo lo necesario para poder configurar y servir con éxito contenidos estáticos desde nuestras aplicaciones. Espero que la serie os haya resultado interesante y le saquéis partido en vuestros proyectos.

Publicado en Variable not found.

Estos contenidos se publican bajo una licencia de Creative Commons Licencia Reconocimiento-No comercial-Compartir bajo la misma licencia 3.0 España de Creative Commons

Aún no hay comentarios, ¡sé el primero!