Se tiene un sitio ejemplo https://MiSitio/home.aspx
Si queremos tener un directorio virtual en nuestra aplicacion para acceder a las evidencias guardadas en un directorio diferente al de nuestra aplicacion y acederlas desde nuestra aplicacion de la siguiente manera
https://MiSitio/Evidencias/imagen1.jpg
https://MiSitio/Evidencias/imagen2.png
https://MiSitio/Evidencias/evidencia1.pdf
En aplicaciones en NET Core montadas en el IIS crear un diretorio de la forma tradicional no es posible, acontinuacion explicamos el por que
Diferencias entre ASP.NET Framework y ASP.NET Core
en IIS:
- Manejo de Solicitudes por
IIS:
- En ASP.NET Framework,
IIS manejaba directamente la mayoría de las solicitudes, incluyendo
archivos estáticos y recursos dentro de directorios virtuales. En ese
modelo, IIS gestionaba tanto las solicitudes a archivos estáticos
(imágenes, CSS, JavaScript) como las solicitudes dinámicas (páginas
ASP.NET o servicios).
- ASP.NET Core, por otro lado, usa el AspNetCoreModule
en IIS, que actúa como un proxy y redirige todas las solicitudes
al servidor Kestrel integrado en ASP.NET Core, que es el
que realmente maneja las solicitudes. IIS en este caso funciona más como
un "front-end" que pasa las solicitudes a Kestrel, en lugar de
manejar directamente archivos estáticos.
- Middleware en ASP.NET Core:
- ASP.NET Core no maneja los directorios
virtuales de la misma forma en que lo hace ASP.NET Framework. En
lugar de delegar directamente a IIS, ASP.NET Core tiene un pipeline de
middleware que se encarga de manejar las solicitudes. Esto significa
que debes configurar explícitamente en el middleware qué rutas o
directorios son accesibles como archivos estáticos.
- Si quieres que un
directorio virtual sea accesible en una aplicación ASP.NET Core, debes
configurarlo en Startup.cs a través del middleware UseStaticFiles para decirle
explícitamente a la aplicación qué carpetas deberían ser servidas como
archivos estáticos.
- ASP.NET Core y el manejo de
archivos estáticos:
- En ASP.NET Framework,
IIS podía acceder directamente a cualquier archivo en un directorio
virtual definido, sin involucrar demasiado a la aplicación en ese
proceso.
- En ASP.NET Core, los
archivos estáticos deben ser servidos explícitamente a través del
middleware UseStaticFiles. El middleware controla
qué carpetas son accesibles y bajo qué rutas virtuales. Esto ofrece más
control y seguridad, pero también significa que los directorios virtuales
tradicionales de IIS no funcionarán sin ser configurados en el
middleware.
- Separación de Concerns
(Responsabilidades):
- En ASP.NET Core, el
manejo de archivos estáticos es un componente explícito de la
aplicación y forma parte del pipeline de solicitudes de la misma. El
objetivo de ASP.NET Core es manejar las solicitudes de una manera más
flexible y controlada, en lugar de delegar completamente a IIS para que
maneje archivos estáticos.
- Por eso, IIS no maneja
directorios virtuales en ASP.NET Core de la manera tradicional, ya
que todo el procesamiento de archivos estáticos se delega al servidor
Kestrel (a menos que se configure de otra forma en el middleware de
ASP.NET Core).
¿Por qué usar el middleware en Startup.cs?
- Control: El middleware en Startup.cs te permite tener control
completo sobre qué carpetas o rutas son accesibles. Puedes configurar
rutas virtuales y servir archivos estáticos de diferentes carpetas de
manera controlada.
- Seguridad: Solo las carpetas que
explícitamente defines en UseStaticFiles estarán disponibles al público. Esto reduce
el riesgo de exposición accidental de archivos.
- Flexibilidad: Puedes definir múltiples
carpetas o rutas virtuales, aplicar reglas de caché, configurar qué tipos
de archivos deben ser servidos, y más
Ejemplo Basico de Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Configurar archivos estáticos para la carpeta "wwwroot" (por defecto)
app.UseStaticFiles();
// Configurar archivos estáticos desde un directorio virtual (como Evidencias)
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(@"D:\EvidenciasDataSys\MisEvidencias"),
RequestPath = "/Evidencias"
});
}
1. Visual Studio Code (integrated terminal):
- Si usas Visual Studio
Code como tu editor, puedes abrir un terminal integrado en Visual
Studio Code.
- Abre VS Code, y en el
menú superior selecciona Terminal > New Terminal.
- Se abrirá un terminal en la
parte inferior, y allí puedes ejecutar el comando para crear el proyecto:
dotnet new web -n FileRepositoryApp
Crea el archivo Startup.cs en el proyecto generado2. Configurar el manejo de archivos estáticos en Startup.cs:
En esta
aplicación, solo necesitas configurar el middleware para servir archivos
estáticos como imágenes y PDFs. Aquí te dejo un ejemplo de cómo debe ser el
archivo Startup.cs:
using Microsoft.Extensions.FileProviders;
namespace FileRepositoryApp
{
public class Startup(IConfiguration configuration)
{
private readonly IConfiguration _configuration = configuration;
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Configuración básica para servir archivos estáticos desde wwwroot
app.UseStaticFiles();
// Obtener la ruta externa desde appsettings.json
string? rutaExterna = _configuration["ExternalFilePath"];
string? ExternalRequestPath = _configuration["ExternalRequestPath"];
if (!string.IsNullOrEmpty(rutaExterna) && Directory.Exists(rutaExterna))
{
// Configuración para servir archivos desde una carpeta externa
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(rutaExterna),
RequestPath = ExternalRequestPath // Ruta virtual para acceder a la carpeta
});
}
else
{
// Manejo del caso donde la ruta es nula o no existe
throw new Exception("La ruta externa para los archivos estáticos no está configurada correctamente o no existe.");
}
}
}
}
FileRepositoryApp
Descripción
FileRepositoryApp es una aplicación diseñada para servir archivos estáticos (como imágenes y PDFs) a través de una API personalizada. Utiliza configuraciones definidas en el archivo appsettings.json
para controlar las rutas de los archivos servidos.
Configuración
appsettings.json
ExternalFilePath: Especifica la ruta física en el servidor donde están almacenados los archivos.
{ "ExternalFilePath": "C:\Files\ExternalContent" }
En este ejemplo, los archivos se encuentran en
C:\Files\ExternalContent
.ExternalRequestPath: Define la ruta virtual (URL) a través de la cual los archivos serán accesibles.
{ "ExternalRequestPath": "/content" }
Los archivos estarán disponibles en una URL como
https://misitio.com/content
.
web.config
El archivo web.config
es necesario si la aplicación está siendo desplegada en IIS. La sección aspNetCore
se utiliza para configurar cómo el servidor IIS maneja la ejecución de la aplicación ASP.NET Core.
Ejemplo de configuración:
<configuration>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="dotnet" arguments=".\FileRepositoryApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
</system.webServer>
</configuration>
processPath
: Especifica el proceso que inicia la aplicación (dotnet
en este caso).arguments
: Indica el archivo de la aplicación que debe ser ejecutado (FileRepositoryApp.dll
).stdoutLogFile
: Define dónde almacenar los logs de salida estándar.
Uso
Configura las rutas en
appsettings.json
:ExternalFilePath
: Ruta física donde se almacenan los archivos.ExternalRequestPath
: Ruta virtual a través de la cual se acceden los archivos.
Ejecuta la aplicación:
- La aplicación puede ejecutarse localmente utilizando
.NET Core
o desplegarse en un servidor IIS. - Si está desplegada en IIS, asegúrate de que la sección
aspNetCore
esté correctamente configurada en el archivoweb.config
.
- La aplicación puede ejecutarse localmente utilizando
Acceso a los archivos:
- Los archivos almacenados en la carpeta física especificada en
ExternalFilePath
serán accesibles a través de la URL especificada enExternalRequestPath
. - Por ejemplo, si
ExternalFilePath
está configurado enC:\Files\ExternalContent
yExternalRequestPath
está en/content
, un archivoimage.png
en esa carpeta será accesible en:https://misitio.com/content/image.png
- Los archivos almacenados en la carpeta física especificada en
Instalación
Clona este repositorio:
git clone https://github.com/genexusmancilla/FileRepositoryApp.git
Configura las rutas de los archivos en
appsettings.json
.Ejecuta la aplicación localmente o despliega en un servidor IIS.
Contribuciones
Si deseas contribuir a este proyecto, por favor, envía un pull request con una descripción detallada de los cambios propuestos.
Licencia
Este proyecto está bajo la licencia MIT.