.NET Core

Servir archivos estáticos

Desde el directorio raíz wwwroot

En .NET Core los archivos estáticos (html, css, js…) se proporcionan por defecto desde el directorio raíz wwwroot.

Para habilitar esta funcionalidad solo hay que indicarlo a través del método de extensión UseStaticFiles.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{   
    app.UseStaticFiles();
}

Desde fuera del directorio wwwroot

El método UseStaticFiles admite sobre carga de parámetros permitiendo pasar un objeto del tipo StaticFileOptions en el cual podremos indicar la ruta física del nuevo directorio así como la URL desde la que se expondrán.

 app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(env.ContentRootPath, "NewStaticFilesFolder")),
        RequestPath = "/NewStaticFilesURL"
    });

El ejemplo muestra un nuevo directorio NewStaticFilesFolder donde se alojan los archivos estáticos y la URL en la que se pueden solicitar /NewStaticFilesURL.

Si se desea mantener la URL en la raíz del sitio basta con no asignar valor a la propiedad RequestPath o bien asignar una cadena vacía String.Empty().

Desde una librería de clases (dll)

Otra opción de servir archivos estáticos es desde una dll externa al proyecto web/api.

Como ejemplo crearemos un proyecto del tipo Class Library (dll) de NET Core con el nombre Api.Common.

Dentro de este proyecto crearemos el directorio Assets donde agregaremos nuestros archivos css, html…. Aconsejo no incluir subdirectorios que contengan el guion medio en su nombre como js-files. En lugar de ello usar el punto u otro caracter (js.files). He tenido problemas con esto provocando que no se cargaran correctamente los archivos.

👉  Configurar TypeScript en Visual Studio Code con NPM

Ahora ya podemos configurar en nuestra web/api el método UseStaticFiles para cargar estos archivos desde la dll.

builder.UseStaticFiles();
builder.UseStaticFiles(new StaticFileOptions
{
	RequestPath = string.Empty,
	FileProvider = new EmbeddedFileProvider(typeof(DllClass).GetTypeInfo().Assembly, "Api.Common.Assets")
});

  • DllClass: una clase cualquiera de nuestro proyecto Class Library. Se utiliza para determinar el ensamblado de la dll.
  • «Api.Common.Assets»: se forma con el nombre del ensamblado de la dll concatenado al directorio raíz donde guardaremos los archivos estáticos. En este caso el directorio Assets.
  • RequestPath: indica la ruta desde la que se servirán estos archivos estáticos. En el ejemplo se pasa una cadena vacía lo que indica que se servirán desde la raíz del sitio web.

Rutas

Directorio de ejecución del proyecto

var baseDirectory = AppContext.BaseDirectory;

Directorio raíz del proyecto

var baseDirectory = AppContext.BaseDirectory;
var projectDirectory = baseDirectory.Substring(0, AppContext.BaseDirectory.IndexOf("bin"));

👇Tu comentario