Saltar al contenido

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

17 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 Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 5 de abril de 2016
ASP.NET CoreEn la primera entrega de esta serie comentamos las diferencias que encontramos entre ASP.NET 4.x y ASP.NET Core a la hora de procesar peticiones dirigidas hacia recursos estáticos de nuestro sitio web, que pasaba de ser una funcionalidad integrada en IIS a convertirse en un módulo opcional que tenemos que incluir y configurar expresamente cuando necesitemos esta característica.

Para entrar en materia, en dicho post presentamos StaticFilesMiddleware, el componente proporcionado por ASP.NET Core que, insertado convenientemente en el pipeline, es capaz de capturar las peticiones cuya ruta coincide con un recurso estático presente en el sistema de archivos y retornar su contenido al cliente.

Sin embargo, el paquete Nuget Microsoft.AspNetCore.StaticFiles contiene otros middlewares que cubren necesidades que podemos encontrar con frecuencia cuando en nuestras aplicaciones necesitemos gestionar contenidos estáticos.

Y aún a riesgo de resultar cansino, antes de continuar os recuerdo que seguimos trabajando con versiones preliminares de ASP.NET Core, por lo que todavía podrían introducirse cambios en el producto.

¿Y si quiero ojear un directorio? Introducing DirectoryBrowserMiddleware

Cuando en IIS dábamos los permisos oportunos, era posible acceder con el navegador a una carpeta del servidor, listar sus archivos, entrar en subdirectorios, volver al directorio anterior, etc.

Sin embargo, ya hemos visto que en ASP.NET Core esto no es posible si antes no hemos posicionado en el pipeline un middleware que aporte esa funcionalidad, y nuestro nuevo amigo StaticFilesMiddleware no llegaba a tanto.

Por esta razón, dentro del mismo paquete Microsoft.AspNetCore.StaticFiles encontramos el componente DirectoryBrowserMiddleware, que, como su nombre indica, es un middleware expresamente diseñado para aportar funcionalidades de "browsing" sobre directorios del sistema de archivos.

Para incluirlo en el pipeline utilizaremos el habitual extensor de la siguiente forma, en el interior del método Configure() de la clase Startup:
public void Configure(IApplicationBuilder app)
{
    ...
    app.UseDirectoryBrowser();
    ...
}
Tras incluir esta simple línea en el código de inicialización, nuestra aplicación será ya capaz de permitir la navegación del usuario por el directorio por defecto:

DirectoryBrowserMiddleware en acción
Como es de esperar, el middleware examinará las peticiones entrantes y capturará aquellas cuya ruta coincida con la de una carpeta existente en el sistema de archivos, retornando directamente su contenido. Así, en la captura de pantalla anterior, vemos que una petición al raíz del sitio web retorna el contenido de la carpeta "wwwroot", y otra petición dirigida a "/images" retorna el contenido de esta subcarpeta.

De la misma forma que ocurría en el caso de StaticFilesMiddleware, el extensor UseDirectoryBrowser() también admite parámetros que permiten personalizar el comportamiento del componente mediante las propiedades de un objeto DirectoryBrowserOptions:

Opciones de configuración de DirectoryBrowserMiddleware
El primero de los parámetros, RequestPath, permite indicar la ruta "raíz" a partir de la cual se permitirá la navegación del usuario. Por ejemplo, si la establecemos con el valor "/static", el middleware sólo procesará las peticiones que comiencen por este prefijo, como "/static/images" o "/static/anything/else"

La propiedad FileProvider, como ya vimos en el post anterior, permite especificar un objeto de tipo IFileProvider que representa el origen de archivos que se va a mostrar. La implementación por defecto es un objeto PhysicalFileProvider apuntando a la carpeta "wwwroot" en el disco físico del servidor, pero en realidad podría ser cualquier tipo de sistema de almacenamiento porque las abstracciones proporcionadas por el interfaz aíslan de detalles de menor nivel.

Por ejemplo, si quisiéramos dar acceso de navegación a la carpeta raíz del servidor (cosa, por cierto, nada recomendable), podríamos utilizar el mismo proveedor de archivos físicos, pero inicializándolo convenientemente:
app.UseDirectoryBrowser(new DirectoryBrowserOptions()
{
    FileProvider = new PhysicalFileProvider(@"\")                                
});
Formatter es la última propiedad que encontramos en DirectoryBrowserOptions es la que nos da la capacidad de personalizar el "cómo se dibuja" el resultado, es decir, la generación del código HTML que se envía al cliente resultante de la navegación por un directorio determinado. Se trata de una instancia que implementa IDirectoryFormatter, que define el siguiente contrato:
public interface IDirectoryFormatter
{
    Task GenerateContentAsync(HttpContext context, 
                              IEnumerable<IFileInfo> contents);
}
Por tanto, si quisiéramos personalizar la forma en que se muestra el contenido de los directorios, sólo deberíamos crear una clase que cumpla este interfaz, cuyo método GenerateContentAsync() renderice el conjunto de archivos suministrado en la lista contents sobre context.Response de la forma que más nos guste.

Y lo dejamos aquí de momento, porque ya podríamos decir que casi lo sabemos todo ;) Pero en el siguiente post, el último ya de la serie, veremos un último middleware y algunos extensores que nos permitirán afinar aún más el comportamiento de nuestro sistema relativo a la gestión de peticiones a archivos estáticos, y a ser algo más productivos.

Publicado en Variable not found.

2 Comentarios:

Unknown dijo...

Si quiero listar mis archivos que tengo en mi servidor y poder descargarlos como podría realizarlo.

José María Aguilar dijo...

Hola!

Si quieres ojear el directorio, puedes usar el middleware DirectoryBrowser que se describe en este post, y para que se puedan descargar necesitarás el StaticFiles descrito en el post anterior de la serie.

También puedes echar un vistazo al middlewe FileServer que se describe en el siguiente post.

Saludos!