martes, 5 de abril de 2016
En 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
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.
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
Por esta razón, dentro del mismo paquete Microsoft.AspNetCore.StaticFiles encontramos el componente
Para incluirlo en el pipeline utilizaremos el habitual extensor de la siguiente forma, en el interior del método
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
El primero de los parámetros,
La propiedad
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:
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.
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:
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
: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.
Publicado por José M. Aguilar a las 9:10 a. m.
Etiquetas: aspnetcore, aspnetcoremvc, middlewares, static files
2 Comentarios:
Si quiero listar mis archivos que tengo en mi servidor y poder descargarlos como podría realizarlo.
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!
Enviar un nuevo comentario