Solución:
Los archivos estáticos, como HTML, CSS, imágenes y JavaScript, son activos que una aplicación ASP.NET Core sirve directamente a los clientes. Se requiere alguna configuración para habilitar el servicio de estos archivos.
-
UseStaticFiles: sirve archivos dentro de la raíz web (carpeta wwwroot)
-
UseSpaStaticFiles: sirve archivos estáticos como imagen, css, js en la carpeta de activos de la aplicación angular
-
UseSpa: deje que asp.net core sepa qué directorio desea ejecutar su aplicación angular, qué carpeta dist cuando se ejecuta en modo de producción y qué comando ejecutar la aplicación angular en modo dev
Ejemplo
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
app.UseSpa(spa =>
{
// To learn more about options for serving an Angular SPA from ASP.NET Core,
// see https://go.microsoft.com/fwlink/?linkid=864501
spa.Options.SourcePath = "ClientApp";
if (env.IsDevelopment())
{
spa.UseAngularCliServer(npmScript: "start");
}
});
- UseStaticFiles sirve archivos de wwwroot pero se puede cambiar.
-
UseSpaStaticFiles hace algo similar pero requiere que ISpaStaticFileProvider esté registrado. Si app.ApplicationServices.GetService
() devuelve nulo, entonces obtendrá una excepción.
throw new InvalidOperationException($"To use {nameof(UseSpaStaticFiles)}, you must " +
$"first register an {nameof(ISpaStaticFileProvider)} in the service provider, typically " +
$"by calling services.{nameof(AddSpaStaticFiles)}.");
Entonces necesitas llamar app.AddSpaStaticFiles () para registrarse por defecto ISpaStaticFileProvider
- UseSpa hace dos cosas. Vuelve a escribir todas las solicitudes en la página predeterminada e intenta configurar el servicio de archivos estáticos. Al contrario de UseSpaStaticFiles no lanza una excepción sino que simplemente vuelve a la carpeta wwwroot.
En realidad, UseSpaStaticFiles y UseSpa llaman internamente al mismo método UseSpaStaticFilesInternal pero con un valor diferente para el tercer parámetro que es allowFallbackOnServingWebRootFiles. Esa es la razón por la que UseSpaStaticFiles lanza una excepción si no se registró ningún ISpaStaticFileProvider, simplemente no permite volver a wwwroot.
por cierto si UseSpa vuelve a wwwroot internamente, llama viejo bueno app.UseStaticFiles (staticFileOptions);
Enlaces a fuentes de github: 1. SpaDefaultMiddleware 2. SpaStaticFilesExtensions