web-dev-qa-db-fra.com

Asp.Net Core 2.0 Kestrel ne servant pas de contenu statique

Edit: Ajout de Kestrel Out

Lors de l'exécution d'une application Asp.Net Core 2.0 à l'aide de IIS express, les fichiers statiques (css, js) sont servis comme prévu. Cependant, lorsque vous utilisez la ligne de commande/Kestrel via "dotnet publish -o [targetDirectory]" et dotnet [website.dll], Kestrel ne sert aucun contenu statique. En utilisant le navigateur F12, je vois que Kestrel renvoie une erreur 404. En regardant de plus près, lorsque vous entrez le chemin du fichier directement dans le navigateur (localhost: 5000/css /cssfile.css), le fichier n’est pas affiché mais le navigateur semble rediriger vers "localhost: 5000/cssfile.css " mais renvoie toujours une erreur 404 (notez le répertoire/css/manquant). 

J'ai créé ce projet via Visual Studio 2017 et choisi les valeurs par défaut d'une nouvelle application MVC Core 2.0 (le kit de développement logiciel était installé). 

J'ai suivi les étapes ici pour activer les fichiers statiques dans les fichiers program.cs et startup.cs. Ceux-ci implémentent "app.UseStaticFiles ();" et ".UseContentRoot (Directory.GetCurrentDirectory ())". Aucun des articles trouvés via Google ne semble aider. J'ai vérifié que dotnet avait copié le contenu statique dans le répertoire cible. 

Qu'est-ce que je rate? Merci

// Program.cs
public static IWebHost BuildWebHost(string[] args) => WebHost
   .CreateDefaultBuilder(args)
   .UseStartup<Startup>()
   .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?}");
    });
}
5
davewilliams459

Je ne parviens pas à reproduire votre erreur à l'aide d'un nouveau projet ASP.NET Core 2.0 en procédant comme suit.

  1. md static-test
  2. cd static-test
  3. dotnet new web
  4. Ajoutez le dossier cssdans wwwroot.
  5. Ajoutez le fichier site.css dans wwwroot/css.
  6. Insérez app.UseStaticFiles(); au début de la méthode Startup.Configure().
  7. dotnet publish -o pubweb
  8. cd pubweb
  9. dotnet .\static-test.dll
  10. Accès http: // localhost: 5000/css/site.css en utilisant un navigateur.

dotnet.exe rend la sortie suivante dans mon 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'

Comme vous pouvez le constater, le fichier css sera correctement servi dans un sous-dossier. Essayez les étapes ci-dessus et comparez le code et la sortie avec votre projet défaillant. S'il échoue toujours, attachez les informations de débogage à Requestvs Physicalpath de Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware ci-dessus.

10
jcemoller

J'ai essayé tellement de choses inutiles, c'était la solution pour moi:

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

Servir des fichiers statiques a commencé à fonctionner dès que j'ai ajouté:

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

J'ai eu un conflit sur l'un de mes serveurs s'exécutant sur le port 5000; j'ai donc spécifié de démarrer sur le port 5050.

14
Jeremy Thompson

Je viens de rencontrer un problème très similaire. Je ne pouvais pas obtenir de Kestrel un contenu statique; J'avais une configuration qui fonctionnait bien dans .net core 1.1, mais cela ne fonctionnerait pas dans .net core 2.0.

J'ai débogué et l'instance IFileProvider utilisée par le middleware de fichier statique était NullFileProvider. Je devais le faire dans Startup.cs pour obtenir du contenu statique servi:

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

Pour moi, le problème était le répertoire de travail. Je ne faisais pas attention au répertoire dans lequel j'étais dans le lancement de l'application avec dotnet /var/www/project/project.dll. Il utilise automatiquement votre répertoire actuel comme répertoire de travail lorsque vous lancez l'application de cette manière.

Je m'en suis rendu compte lorsque j'ai consulté un fichier .service pour un autre projet, pour lequel le répertoire de travail est spécifié:

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

Vous devez donc vous assurer que vous êtes dans le bon répertoire lorsque vous exécutez votre projet ou vous assurer que le répertoire de travail est correctement défini dans votre fichier .service.

2
Adam J.

Après des essais et des erreurs, je me suis rendu compte que lorsque je commence à utiliser Kestrel, la racine Web des fichiers statiques est soudainement mappée vers le dossier bin au lieu du dossier de développement. Pour résoudre ce problème, vous pouvez faire l'une des deux choses suivantes. 

  1. Vous pouvez définir tous les fichiers statiques que vous souhaitez inclure sur Copier dans le répertoire de sortie.
  2. Vous pouvez remapper le répertoire racine sur un certain chemin:

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

J'utilise le dossier wwwroot dans lequel je développe afin de ne pas avoir à m'assurer que tous les nouveaux éléments sont ajoutés à Copier dans le répertoire de sortie.

1
Kyle B

J'ai créé un nouveau projet avec asp.net core 2.1 (MVC) avec le modèle MS, puis j'ai inclus un fichier css animate.css avec des animations.

Pour pouvoir l'utiliser, un href doit être ajouté dans _Layout.cshtml
Ainsi, j’ai noté que MS a "oublié" d’ajouter les environnements "Staging" et "Production" Donc ... si le href est ajouté dans l’environnement "Développement", tout fonctionne bien en débogage (IIS Express), mais cela ne fonctionne pas avec un selfhost (et je suppose aussi pas sur "le vrai" IIS), car c'est pas l'environnement de développement et les hrefs sont pas défini à l'exécution.
Par conséquent, j’ai copié l’environnement "Développement" également pour "Mise en scène" et "Production" (voir la capture ci-dessous).

  <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
        <link rel="stylesheet" href="~/css/animate.css">
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>

    @*<environment include="Staging,Production"> -> was missing completely!copy pasted from Development*@
    <environment include="Staging,Production">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
        <link rel="stylesheet" href="~/css/animate.css">
    </environment>
    <environment exclude="Staging,Production">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
    @*End manually inserted*@
1
FredyWenger

Veuillez vérifier si ces fichiers statiques sont présents dans les balises ci-dessous. 

<environment include="Development">
</environment>

Comme vous avez publié, si les fichiers statiques sont présents dans le include Development, ils ne seront pas présents dans le dossier Published . Vérifiez également View Source et voyez si ces liens sont présents ou non.

0
Bala Sakthis

Si vous rencontrez ce problème dans Docker, vous devez savoir que la "racine" est basée sur l'emplacement où vous exécutez la commande dotnet. Je ne suis pas sûr que cela ait le plus de sens, mais c'est ce que c'est. Il est facile de s’assurer que votre conteneur Docker se trouve dans le bon répertoire avant d’exécuter la commande.

WORKDIR /app
# Example publish/build command:
RUN dotnet publish -o out
# Your publish folder is /app/out so...
# ENTRYPOINT ["dotnet", "/app/out/myapp.dll"]
# will run but you'll get 404s on all your static content. 
# Instead use:
WORKDIR /app/out
ENTRYPOINT ["dotnet", "myapp.dll"]

N'utilisez pas mon script comme exemple de script de publication Docker approprié. C'est juste un exemple.

0
Spencer Ruport