web-dev-qa-db-de.com

Asp.Net Core 2.0 Kestrel liefert keinen statischen Inhalt

Bearbeiten: Der Turmfalke wurde hinzugefügt

Wenn Sie eine Asp.Net Core 2.0-App mit IIS express ausführen, werden statische Dateien (css, js) erwartungsgemäß bereitgestellt. Bei der Verwendung der Befehlszeile/Kestrel über "dotnet publish -o [targetDirectory]" und dotnet [website.dll] liefert Kestrel jedoch keinen statischen Inhalt. Mit dem Browser F12 wird angezeigt, dass Kestrel einen Fehler 404 zurückgibt. Wenn Sie den Dateipfad direkt im Browser eingeben (localhost: 5000/css /cssfile.css), wird die Datei nicht angezeigt, sondern der Browser scheint auf "localhost: 5000/cssfile.css" umzuleiten.) " gibt jedoch weiterhin einen 404-Fehler zurück (beachten Sie das fehlende/css Verzeichnis). 

Ich habe dieses Projekt über Visual Studio 2017 erstellt und die Standardeinstellungen für eine neue MVC Core 2.0-Anwendung (SDK wurde installiert) ausgewählt. 

Ich habe die Schritte/- hier ausgeführt, um statische Dateien in den Dateien program.cs und startup.cs zu aktivieren. Diese implementieren "app.UseStaticFiles ();" und ".UseContentRoot (Directory.GetCurrentDirectory ())". Keiner der über Google gefundenen Artikel scheint zu helfen. Ich habe überprüft, dass dotnet den statischen Inhalt in das Zielverzeichnis kopiert hat. 

Was vermisse ich? Vielen Dank

// 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

Ich kann Ihren Fehler nicht mit einem neuen ASP.NET Core 2.0-Projekt reproduzieren, indem ich die folgenden Schritte befolge.

  1. md static-test
  2. cd static-test
  3. dotnet new web
  4. Fügen Sie den Ordner css in wwwroot hinzu.
  5. Fügen Sie die Datei site.css in wwwroot/css hinzu.
  6. Fügen Sie app.UseStaticFiles(); am Anfang der Methode Startup.Configure() ein.
  7. dotnet publish -o pubweb
  8. cd pubweb
  9. dotnet .\static-test.dll
  10. Zugriff http: // localhost: 5000/css/site.css über den Browser.

dotnet.exe gibt die folgende Ausgabe in meinem Terminal aus:

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'

Wie Sie sehen, wird die CSS-Datei in einem Unterordner ordnungsgemäß bereitgestellt. Bitte versuchen Sie die obigen Schritte und vergleichen Sie den Code und die Ausgabe mit Ihrem fehlgeschlagenen Projekt. Wenn dies weiterhin fehlschlägt, fügen Sie die Debug-Informationen zum Pfad Request vs. Physical von Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware oben hinzu.

10
jcemoller

Ich habe so viele nutzlose Dinge ausprobiert, dies war die Lösung für mich:

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

Die Bereitstellung statischer Dateien funktionierte, sobald ich Folgendes hinzugefügt hatte:

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

Ich habe einen Konflikt auf einem meiner Server, der an Port 5000 ausgeführt wird, und ich habe angegeben, dass er an Port 5050 starten soll.

14
Jeremy Thompson

Ich bin gerade auf eine sehr ähnliche Ausgabe gestoßen. Ich konnte Kestrel nicht dazu bringen, statische Inhalte zu liefern. Ich hatte eine Config, die in .net Core 1.1 gut funktionierte, aber in .net Core 2.0 nicht.

Ich habe darüber debuggt und die IFileProvider-Instanz, die von der statischen Datei-Middleware verwendet wird, war NullFileProvider. Ich musste dies in Startup.cs tun, um statischen Inhalt zu erhalten:

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

Für mich war das Problem das Arbeitsverzeichnis. Ich habe nicht auf das Verzeichnis geachtet, in dem ich mich versuche, die App mit dotnet /var/www/project/project.dll zu starten. Ihr aktuelles Verzeichnis wird automatisch als Arbeitsverzeichnis verwendet, wenn Sie die App auf diese Weise starten.

Dies wurde mir klar, als ich eine .service-Datei für ein anderes Projekt sah, in dem das Arbeitsverzeichnis angegeben ist:

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

Stellen Sie also sicher, dass Sie sich beim Ausführen Ihres Projekts im richtigen Verzeichnis befinden, oder stellen Sie sicher, dass das Arbeitsverzeichnis in Ihrer .service-Datei ordnungsgemäß festgelegt ist.

2
Adam J.

Nach Versuch und Irrtum wurde mir klar, dass, sobald ich mit Kestrel angefangen habe, das Webstammverzeichnis für statische Dateien plötzlich dem Ordner bin anstelle des Entwicklungsordners zugeordnet wird. Um dies zu beheben, haben Sie zwei Möglichkeiten. 

  1. Sie können alle statischen Dateien, die Sie einschließen möchten, auf In Ausgabeverzeichnis kopieren setzen
  2. Sie können das Stammverzeichnis einem bestimmten Pfad zuordnen:

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

Ich verwende den wwwroot-Ordner, in dem ich entwickle, so dass ich nicht sicherstellen muss, dass alle neuen Elemente zum In Ausgabeverzeichnis kopieren hinzugefügt werden.

1
Kyle B

Ich habe ein neues Projekt mit asp.net core 2.1 (MVC) mit der MS-Vorlage erstellt und dann eine css-Datei animate.css mit einigen Animationen eingefügt.

Um es verwenden zu können, muss eine href in _Layout.cshtml hinzugefügt werden.
Dabei habe ich bemerkt, dass MS die Umgebungen "Staging" und "Production" .__ "vergessen" hat. Also ... wenn die href in der "Development" -Umgebung hinzugefügt wird, funktioniert alles fein im Debugging (IIS Express), aber es funktioniert nicht mit einem Selfhost (und ich gehe auch nicht von "dem echten" IIS aus), da dies nicht die Entwicklungsumgebung ist und die Hrefs's nicht zur Laufzeit gesetzt.
Deshalb habe ich die "Entwicklungsumgebung" auch für "Staging" und "Produktion" kopiert (siehe unten).

  <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

Bitte überprüfen Sie, ob diese statischen Dateien in den folgenden Tags vorhanden sind. 

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

Wenn die statischen Dateien innerhalb von include Development vorhanden sind, werden sie, wie bereits veröffentlicht, nicht im Ordner Published vorhanden sein. Überprüfen Sie auch View Source und prüfen Sie, ob diese Links vorhanden sind oder nicht.

0
Bala Sakthis

Wenn Sie in Docker darauf stoßen, müssen Sie wissen, dass das "root" darauf basiert, wo Sie den Befehl dotnet ausführen. Ich bin nicht sicher, ob das am sinnvollsten ist, aber es ist was es ist. Wenn Sie sich leicht stolpern lassen möchten, müssen Sie sicherstellen, dass sich Ihr Docker-Container im richtigen Verzeichnis befindet, bevor Sie den Befehl ausführen.

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"]

Verwenden Sie mein Skript nicht als Beispiel für ein ordnungsgemäßes Docker-Veröffentlichungsskript. Es ist nur ein Beispiel.

0
Spencer Ruport

Ich hatte ein ähnliches Problem. (Ich habe in Win entwickelt und unter Linux gehostet, falls es einen Unterschied macht). Nur ein paar Dateien funktionierten (meistens Standarddateien), aber mein eigener Inhalt verursachte 404.

Der Täter war: Großbuchstaben in Datei- und Ordnernamen haben bei mir nicht funktioniert. Alles in Kleinbuchstaben konvertiert und es funktioniert gut.

0
Grtschnk