Asp.Net Core 2.0 Kestrel no sirve contenido estático

Edición: Añadido cernícalo

Cuando se ejecuta una aplicación Asp.Net Core 2.0 con IIS Express, los archivos estáticos (css, js) se sirven como se espera. Sin embargo, cuando se utiliza la línea de comandos / Kestrel mediante “dotnet publish -o [targetDirectory]” y dotnet [website.dll], Kestrel no ofrece ningún contenido estático. Al utilizar el navegador F12, veo que Kestrel devuelve un error 404. Mirando más de cerca, al ingresar la ruta del archivo directamente en el navegador (localhost: 5000 / css /cssfile.css), el archivo no se muestra, pero el navegador parece redirigir a “localhost: 5000 / cssfile.css” pero sigue devolviendo un error 404 (note el directorio / css / faltante).

Creé este proyecto a través de Visual Studio 2017, y elegí los valores predeterminados para una nueva aplicación MVC Core 2.0 (se instaló el SDK).

He seguido los pasos aquí para habilitar los archivos estáticos en los archivos program.cs y startup.cs. Estos implementan “app.UseStaticFiles ();” y “.UseContentRoot (Directory.GetCurrentDirectory ())”. Ninguno de los artículos encontrados a través de google parece ayudar. He verificado que dotnet copió el contenido estático al directorio de destino.

¿Qué me estoy perdiendo? Gracias

// Program.cs public static IWebHost BuildWebHost(string[] args) => WebHost .CreateDefaultBuilder(args) .UseStartup() .Build(); // Startup.cs public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseExceptionHandler("/Error/HandleError"); app.UseStaticFiles(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=User}/{action=Index}/{id?}"); }); } 

No puedo reproducir su error usando un nuevo proyecto ASP.NET Core 2.0 siguiendo estos pasos;

  1. md prueba de estática
  2. prueba estática de cd
  3. nueva web dotnet
  4. Añadir carpeta css en wwwroot.
  5. Agregue el archivo site.css en wwwroot/css .
  6. Insertar app.UseStaticFiles(); al inicio del método Startup.Configure() .
  7. punto publicar -o pubweb
  8. cd pubweb
  9. dotnet. \ static-test.dll
  10. Acceda a http: // localhost: 5000 / css / site.css utilizando el navegador.

dotnet.exe muestra la siguiente salida en mi terminal:

 Hosting environment: Production Content root path: C:\src\static-test\pubweb Now listening on: http://localhost:5000 Application started. Press Ctrl+C to shut down. info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1] Request starting HTTP/1.1 GET http://localhost:5000/css/site.css info: Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware[2] Sending file. Request path: '/css/site.css'. Physical path: 'C:\src\static-test\pubweb\wwwroot\css\site.css' 

Como puede ver, servirá correctamente el archivo css dentro de una subcarpeta correctamente. Pruebe los pasos anteriores y compare el código y la salida con su proyecto fallido. Si sigue fallando, adjunte la información de depuración en la ruta de Request frente a la Ruta Physical de Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware arriba.

Probé tantas cosas inútiles, esta fue la solución para mí:

 WebHost.CreateDefaultBuilder(args) .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup() .UseWebRoot("E:\\xyz\\wwwroot") .UseUrls("http://localhost:5050") .Build(); 

La publicación de archivos estáticos comenzó a funcionar tan pronto como agregué:

 .UseWebRoot("E:\\xyz\\wwwroot") 

Tengo un conflicto en uno de mis servidores que se ejecuta en el puerto 5000, por lo que especifiqué comenzar en el puerto 5050.

Acabo de encontrar un problema muy similar. No pude conseguir que Kestrel presentara ningún contenido estático; Tenía una configuración que funcionaba bien en .net core 1.1, pero no funcionaría en .net core 2.0.

Lo depuré y la instancia de IFileProvider utilizada por el middleware de archivo estático fue NullFileProvider. Tuve que hacer esto en Startup.cs para obtener contenido estático servido:

 app.UseFileServer( new FileServerOptions() { FileProvider = new PhysicalFileProvider("some_path") }); 

Compruebe si esos archivos estáticos están presentes dentro de las siguientes tags.

   

Como ha publicado, si los archivos estáticos están presentes dentro del include Development , entonces no estarán presentes en la carpeta Publicado . Además, marque View Source y vea si esos enlaces están presentes o no.

Después de la prueba y el error, me di cuenta de que una vez que comencé a usar Kestrel, la raíz web de los archivos estáticos se asigna de repente a la carpeta bin en lugar de a la carpeta de desarrollo. Para arreglar esto puedes hacer una de dos cosas.

  1. Puede configurar todos los archivos estáticos que desea incluir para Copiar en el Directorio de salida
  2. Puede volver a asignar el directorio raíz a una ruta determinada:

     .UseKestrel(...) .UseWebRoot(@"C:\MyProject\wwwroot\"); 

Utilizo la carpeta wwwroot que desarrollo, por lo que no tengo que asegurar que todos los elementos nuevos se agreguen a Copiar en el Directorio de salida.

Para mí, el problema era el directorio de trabajo. No estaba prestando atención al directorio en el que estaba cuando intentaba iniciar la aplicación con dotnet /var/www/project/project.dll . Utiliza automáticamente su directorio actual como el directorio de trabajo cuando inicia la aplicación de esta manera.

Me di cuenta de esto cuando miré un archivo .service para otro proyecto, que tiene especificado el WorkingDirectory:

 ... WorkingDirectory=/var/www/project/ ExecStart=/usr/bin/dotnet /var/www/project/project.dll ... 

Por lo tanto, asegúrese de estar en el directorio correcto cuando ejecute su proyecto o de que el Directorio de trabajo esté correctamente configurado en su archivo de servicio.