webentwicklung-frage-antwort-db.com.de

ASP.NET Core 404-Fehler bei IIS 10

Ich habe ein Problem mit der ASP.NET Core-Webanwendung, die auf IIS 10 ausgeführt wird. Ich entwickle eine Einzelseitenanwendung mit AngularJS.

Die index.html wird perfekt geladen, aber die Back-End-Anforderungen schlagen mit 404-Fehlercode auf dem IIS 10 fehl. In Visual Studio mit IIS Express funktioniert dies perfekt.

Kann jemand erkennen, wie ich die Backend-Anfragen korrigieren kann?

Hier ist meine Program.cs

public static void Main(string[] args)
{
    var Host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
        .UseStartup<Startup>()
        .Build();

    Host.Run();
}

Und hier ist meine Configure-Methode aus Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseDefaultFiles();

    app.UseStaticFiles();

    app.UseIdentity();

    // Custom middleware for Angular UI-Router
    app.Use(async (context, next) =>
    {
        if (!Path.HasExtension(context.Request.Path.Value)
        && context.Request.HttpContext.Request.Headers["X-Requested-With"] != "XMLHttpRequest"
        && context.Request.Method.ToUpper() != "POST"
        && context.Request.Method.ToUpper() != "PUT"
        && context.Request.Method.ToUpper() != "DELETE")
        {
            await context.Response.WriteAsync(File.ReadAllText(env.WebRootPath + "/index.html"));
        }

        await next();
    });

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "api/{controller=Home}/{action=Index}/{id?}");
    });
}
17
Mate Zabo

Ihr Code funktioniert auf meinem Computer mit Kestrel. Ein guter Schritt zur Fehlerbehebung besteht darin, herauszufinden, ob das Problem bei Ihrer ASP.NET Core-Anwendung oder bei Ihrer IIS Hosting-Konfiguration) liegt.

Versuchen Sie dies aus dem Stammverzeichnis Ihres Projekts.

dotnet restore
dotnet run

Sie werden so etwas sehen:

Hosting environment: Production
Content root path: C:\MyApplicationPath
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

Gehen Sie in Ihrem Browser zu den folgenden zwei URLs. Wenn sie nicht funktionieren, stimmt etwas mit Ihrer Anwendung nicht. Wenn sie funktionieren, stimmt etwas nicht mit Ihrem IIS Hosting.

localhost:5000        // you will see your index.html page
localhost:5000/api    // you will see your default routes output
12
Shaun Luttin

In meinem Fall bestand das Problem darin, dass mein Controller eine Ausnahme ausgelöst hat. Daher hat das Framework versucht, die nicht verfügbare Ausnahmebehandlungsseite zu verwenden. Der Fehler 404, der Controller selbst, hat einen Fehler von 500 ausgegeben

19
mohas

Zum Nutzen der Suchenden.

Beim Verwenden von IIS wurde eine 404 angezeigt. Ich habe das korrekte Verfahren zum Veröffentlichen ( hier ) und Bereitstellen wie im Detail hier befolgt.

Es dauerte einige Zeit, bis ich herausgefunden hatte, aber ich fand die Antwort schließlich in einem Rick Strahl Blog Post .

Grundsätzlich musste ich beim Erstellen des Anwendungspools neben der Einstellung "Kein verwalteter Code" auch die erweiterten Einstellungen aufrufen und die Anwendungspoolidentität auf "Netzwerkdienst" setzen. Es war in Ordnung unter ApplicationPoolIdentity auf meinem Computer, aber nicht auf einem Computer, auf dem ich bereitgestellt habe.

enter image description here

Aus Gründen der Klarheit lautete mein vollständiges Verfahren:

So erstellen Sie ein Paket:

  1. Dotnet-Core-Website erstellen (ich habe Visual Studio 2017 verwendet)
  2. Veröffentlichen. Hätte die Veröffentlichungsfunktion von VS verwenden können, aber ich habe CLR über den Paketmanager verwendet. Der Befehl lautete:

    dotnet publish -c Release -r win-x64 - in sich geschlossen

Ich musste die Win-x64-Kennung verwenden, da wir mit 64-Bit-Windows Server 2008 kompatibel sein müssen.

Bereitstellen:

  1. Erstellen Sie einen Ordner in C:\inetpub\wwwroot (z. B. "Testsite").
  2. Übernehmen Sie den Inhalt des Veröffentlichungsordners ({root}\bin\Release\netcoreapp2.1\win-x64\publish) und kopieren Sie ihn in den neuen Ordner "testsite" (oder einen gleichwertigen Ordner).
  3. Installieren Sie den Dotnet-Core Laufzeit (nicht SDK!) Auf dem Host-Rechner.
  4. Öffnen Sie IIS. Klicken Sie mit der rechten Maustaste auf "Anwendungspools" und dann auf "Anwendungspool hinzufügen". Erstellen Sie eine Version mit der .NET CLR-Version "Kein verwalteter Code".
  5. (Mein Computer hat diesen Schritt nicht benötigt, der Server jedoch). Klicken Sie erneut auf Anwendungspools. Klicken Sie mit der rechten Maustaste auf Ihren neuen App-Pool und wählen Sie "Erweiterte Einstellungen". Ändern Sie die Identität in "Netzwerkdienst" (siehe Abbildung oben).
  6. Zurück auf der obersten Ebene IIS, Erweitern Sie "Standardwebsite", klicken Sie mit der rechten Maustaste auf den Ordner Ihrer Website und wählen Sie "In Anwendung konvertieren". Wählen Sie Ihren neuen App-Pool ohne verwalteten Code.
  7. Öffnen Sie die Eingabeaufforderung als admin und iisreset. Sie sollten dies erst beim ersten Mal benötigen, nachdem Sie die dotnet-Kernlaufzeit installiert haben.
  8. Besuchen Sie die Site (z. B. http: // localhost/testsite )
7
HockeyJ

Eine andere sehr alberne, aber wahrscheinliche Variante ist, dass die App aufgrund fehlerhafter Bereitstellungseinstellungen in einem Ordner bereitgestellt wurde, der sich von Ihren Erwartungen (z. B. Server-Stammverzeichnis anstelle von Unterordner) unterscheidet.

0
Nick Kovalsky