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, 28 de junio de 2022
ASP.NET Core

Como sabemos, ASP.NET Core viene configurado "de serie" para que el middleware que sirve los archivos estáticos (StaticFilesMiddleware) los obtenga desde la carpeta wwwroot. Y ya vimos hace bastante tiempo que si preferíamos utilizar otro nombre para guardar estos archivos, podíamos hacerlo con cierta facilidad.

Pero como a partir de ASP.NET Core 6 el nuevo modelo de configuración cambió varias piezas de sitio, es bueno volver a echar un vistazo y ver cómo podríamos hacerlo en las últimas versiones del framework.

Antes de ASP.NET Core 6 podíamos servir los estáticos desde otra carpeta modificando ligeramente el archivo Program.cs para cambiar la configuración del host. Por ejemplo, el siguiente código establecía la carpeta de estáticos a "_static" en lugar del clásico "wwwroot":

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseWebRoot("_static");
                webBuilder.UseStartup<Startup>();
            });
}

Tras la llegada de ASP.NET Core 6 y su enfoque de minimal hosting, la configuración se ha simplificado bastante, pero los cambios introducidos hacen que tengamos que enfocar algunas cosas de otra forma. De hecho, si intentamos adaptar el antiguo código de configuración a la nueva fórmula, al modificar la raíz de los estáticos a través del WebHost se lanza una excepción NotSupportedException en tiempo de ejecución:

var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseWebRoot("_static"); // NotSupportedException!!
...

La forma correcta de hacerlo es utilizar otra sobrecarga de CreateBuilder() que permite suministrar un objeto WebApplicationOptions, estableciendo en su propiedad WebRootPath el valor que deseamos:

var builder = WebApplication.CreateBuilder(new WebApplicationOptions()
{
    Args = args,
    WebRootPath = "_static",
});
...

Otra posibilidad, igualmente válida, es hacer que el middleware StaticFilesMiddleware deje de usar el proveedor de archivos por defecto, y crear uno configurado para acceder a una carpeta específica del sistema de archivos:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

// Preparamos el proveedor de archivos
var path = Path.Combine(app.Environment.ContentRootPath, "_static");
var fileProvider = new PhysicalFileProvider(path);

// ... y lo usamos desde StaticFilesMiddleware
app.UseStaticFiles(new StaticFileOptions()
{
    FileProvider = fileProvider
});

Ojo, recordad que si modificáis el nombre de la carpeta de estáticos debéis hacer que sus contenidos pasen a la carpeta de resultados de compilación (por ejemplo, estableciendo la propiedad Copy to Output Directory de los archivos a "Copy if newer") y asegurar que finalmente son incluidos en el despliegue del proyecto.

Publicado en Variable not found.

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