web-dev-qa-db-fra.com

Erreur ASP.NET Core 404 sur IIS 10

J'ai un problème avec l'application Web ASP.NET Core exécutée sur IIS 10. Je développe une application à page unique avec AngularJS.

Le fichier index.html se charge parfaitement mais les requêtes back-end échouent avec le code d'erreur 404 sur le IIS 10. De Visual Studio avec IIS Express, cela fonctionne parfaitement).

Quelqu'un peut-il voir comment puis-je résoudre les demandes de backend?

Voici mon Program.cs

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

    Host.Run();
}

Et voici ma méthode Configure à partir de 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

Votre code travaille sur ma machine avec Kestrel. Une bonne étape de dépannage consiste à déterminer si le problème est lié à votre application ASP.NET Core ou à votre configuration d'hébergement IIS.

Essayez ceci depuis la racine de votre projet.

dotnet restore
dotnet run

Vous verrez quelque chose comme ceci:

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

Dans votre navigateur, accédez aux deux URL suivantes. S'ils ne fonctionnent pas, quelque chose ne va pas avec votre application. S'ils fonctionnent, quelque chose ne va pas avec votre hébergement IIS.

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

Dans mon cas, le problème était que mon contrôleur a levé une exception, donc le framework a essayé d'utiliser la page du gestionnaire d'exceptions qui n'était pas disponible, donc l'erreur 404, le contrôleur lui-même lançait 500 erreurs

19
mohas

Pour le bénéfice des chercheurs.

J'obtenais un 404 lors de l'utilisation d'IIS. J'avais suivi la procédure correcte pour la publication ( ici ) et le déploiement comme détaillé ici .

Il a fallu un certain temps pour comprendre, mais j'ai finalement trouvé la réponse cachée dans un article de blog de Rick Strahl .

Fondamentalement, lors de la création du pool d'applications, ainsi que de la définition de `` No Managed Code '', j'avais également besoin d'accéder aux paramètres avancés et de définir l'identité du pool d'applications sur `` Service réseau ''. C'était bien sous ApplicationPoolIdentity sur ma machine, mais pas sur une machine sur laquelle je me suis déployé.

enter image description here

Donc, pour plus de clarté, ma procédure complète était:

Pour créer un package:

  1. Créer un site Web dotnet core (j'ai utilisé Visual Studio 2017)
  2. Publier. Aurait pu utiliser la fonction de publication de VS, mais j'ai utilisé CLR via le gestionnaire de packages. La commande était:

    dotnet publish -c Release -r win-x64 - autonome

J'ai dû utiliser le identifiant win-x64 car nous devons être compatibles avec Windows Server 2008 64 bits.

Déployer:

  1. Créez un dossier dans C:\inetpub\wwwroot (par exemple 'testsite')
  2. Prenez le contenu du dossier de publication ({root}\bin\Release\netcoreapp2.1\win-x64\publish) et copiez-le dans le nouveau dossier 'testsite' (ou votre équivalent).
  3. Installez le noyau dotnet runtime (pas SDK!) Sur la machine hôte.
  4. Ouvrez IIS. Cliquez avec le bouton droit sur 'Pools d'applications', puis sur 'Ajouter un pool d'applications'. Créez-en un avec la version .NET CLR définie sur "Aucun code géré".
  5. (ma machine n'a pas eu besoin de cette étape, mais le serveur l'a fait.) Cliquez à nouveau sur les pools d'applications. Cliquez avec le bouton droit sur votre nouveau pool d'applications et choisissez "Paramètres avancés". Changez l'identité en "Service réseau" (comme indiqué dans l'image ci-dessus).
  6. De retour au niveau supérieur IIS, développez "Site Web par défaut", cliquez avec le bouton droit sur le dossier de votre site Web et choisissez "Convertir en application". Choisissez votre nouveau pool d'applications sans code managé.
  7. Ouvrez l'invite de commande en tant qu'administrateur et iisreset. Vous ne devriez en avoir besoin que la première fois après avoir installé le runtime core dotnet.
  8. Visitez le site (par exemple http: // localhost/testsite )
7
HockeyJ

Une autre variante très stupide mais probable est que l'application a été déployée dans un dossier différent de ce que vous attendiez (ex: votre racine de serveur au lieu de sous-dossier) en raison de paramètres de déploiement erronés.

0
Nick Kovalsky