Résoudre les problèmes et effectuer le débogage des projets ASP.NET Core

Par Rick Anderson

Les liens suivants fournissent des conseils de résolution des problèmes :

Avertissements kit SDK .NET Core

Les versions 32 bits et 64 bits du kit SDK .NET Core sont installées

Dans la boîte de dialogue Nouveau projet pour ASP.NET Core, vous pouvez voir l’avertissement suivant :

Les versions 32 bits et 64 bits du kit SDK .NET Core sont installées. Seuls les modèles des versions 64 bits installées dans « C:\Program Files\dotnet\sdk\ » sont affichés.

Cet avertissement s’affiche lorsque les versions 32 bits (x86) et 64 bits (x64) du kit SDK .NET Core sont installées. Les raisons courantes pour lesquelles les deux versions peuvent être installées sont les suivantes :

  • Vous avez initialement téléchargé le programme d’installation du kit SDK .NET Core à l’aide d’un ordinateur 32 bits, puis l’avez copié sur un ordinateur 64 bits et l’avez installé sur un ordinateur 64 bits.
  • Le kit SDK .NET Core 32 bits a été installé par une autre application.
  • La version incorrecte a été téléchargée et installée.

Désinstallez le kit SDK .NET Core 32 bits pour empêcher cet avertissement. Désinstaller à partir du Panneau de configuration>Programmes et fonctionnalités>Désinstaller ou modifier un programme. Si vous comprenez pourquoi l’avertissement se produit et ses implications, vous pouvez ignorer l’avertissement.

Le kit SDK .NET Core est installé à plusieurs emplacements

Dans la boîte de dialogue Nouveau projet pour ASP.NET Core, vous pouvez voir l’avertissement suivant :

Le kit SDK .NET Core est installé à plusieurs emplacements. Seuls les modèles à partir des SDK installés dans « C:\Program Files\dotnet\sdk\ » sont affichés.

Ce message s’affiche lorsque vous avez au moins une installation du kit SDK .NET Core dans un répertoire en dehors de C:\Program Files\dotnet\sdk\. Cela se produit généralement lorsque le kit SDK .NET Core a été déployé sur un ordinateur à l’aide du copier/coller au lieu du programme d’installation MSI.

Désinstallez tous les runtimes et sdk .NET Core 32 bits pour empêcher cet avertissement. Désinstaller à partir du Panneau de configuration>Programmes et fonctionnalités>Désinstaller ou modifier un programme. Si vous comprenez pourquoi l’avertissement se produit et ses implications, vous pouvez ignorer l’avertissement.

Aucun sdk .NET Core n’a été détecté

  • Dans la boîte de dialogue Nouveau projet de Visual Studio pour ASP.NET Core, vous pouvez voir l’avertissement suivant :

    Aucun kit SDK .NET Core n’a été détecté. Vérifiez qu’ils sont inclus dans la variable d’environnement PATH.

  • Lors de l’exécution d’une commande dotnet, l’avertissement s’affiche comme suit :

    Impossible de trouver des SDK dotnet installés.

Ces avertissements s’affichent lorsque la variable d’environnement PATH ne pointe vers aucun kit SDK .NET Core sur l’ordinateur. Pour résoudre ce problème :

  • Installez le SDK .NET Core. Obtenez le dernier programme d’installation à partir des téléchargements .NET.
  • Vérifiez que la variable d’environnement PATH pointe vers l’emplacement où le SDK est installé (C:\Program Files\dotnet\ pour 64 bits/x64 ou C:\Program Files (x86)\dotnet\ pour 32 bits/x86). Le programme d’installation du SDK définit normalement PATH. Installez toujours les mêmes nombres de bits SDK et runtimes sur la même machine.

SDK manquant après l’installation de l’offre groupée d’hébergement .NET Core

L’installation de l’offre groupée d’hébergement .NET Core modifie le lors de l’installation PATH du runtime .NET Core pour qu’il pointe vers la version 32 bits (x86) de .NET Core (C:\Program Files (x86)\dotnet\). Cela peut entraîner des SDK manquants lorsque la commande .NET Core dotnet 32 bits (x86) est utilisée (aucun kit SDK .NET Core n’a été détecté). Pour résoudre ce problème, passez C:\Program Files\dotnet\ à une position avant C:\Program Files (x86)\dotnet\ sur PATH.

Obtenir des données à partir d’une application

Si une application est capable de répondre aux demandes, vous pouvez obtenir les données suivantes à partir de l’application à l’aide d’un intergiciel :

  • Requête : Méthode, schéma, hôte, base du chemin, chemin d’accès, chaîne de requête, en-têtes
  • Connexion : adresse IP distante, port distant, adresse IP locale, port local, certificat client
  • Identity: Nom, nom d’affichage
  • Paramètres de configuration
  • Variables d'environnement

Placez le code d’intergiciel suivant au début du pipeline de traitement des requêtes de la méthode Startup.Configure. L’environnement est vérifié avant l’exécution de l’intergiciel pour s’assurer que le code est exécuté uniquement dans l’environnement de développement.

Pour obtenir l’environnement, utilisez l’une des approches suivantes :

  • Injectez IHostingEnvironment dans la méthode Startup.Configure et vérifiez l’environnement avec la variable locale. L’exemple de code suivant démontre cette approche.

  • Affectez l’environnement à une propriété dans la classe Startup. Vérifiez l’environnement à l’aide de la propriété (par exemple, if (Environment.IsDevelopment())).

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
    IConfiguration config)
{
    if (env.IsDevelopment())
    {
        app.Run(async (context) =>
        {
            var sb = new StringBuilder();
            var nl = System.Environment.NewLine;
            var rule = string.Concat(nl, new string('-', 40), nl);
            var authSchemeProvider = app.ApplicationServices
                .GetRequiredService<IAuthenticationSchemeProvider>();

            sb.Append($"Request{rule}");
            sb.Append($"{DateTimeOffset.Now}{nl}");
            sb.Append($"{context.Request.Method} {context.Request.Path}{nl}");
            sb.Append($"Scheme: {context.Request.Scheme}{nl}");
            sb.Append($"Host: {context.Request.Headers["Host"]}{nl}");
            sb.Append($"PathBase: {context.Request.PathBase.Value}{nl}");
            sb.Append($"Path: {context.Request.Path.Value}{nl}");
            sb.Append($"Query: {context.Request.QueryString.Value}{nl}{nl}");

            sb.Append($"Connection{rule}");
            sb.Append($"RemoteIp: {context.Connection.RemoteIpAddress}{nl}");
            sb.Append($"RemotePort: {context.Connection.RemotePort}{nl}");
            sb.Append($"LocalIp: {context.Connection.LocalIpAddress}{nl}");
            sb.Append($"LocalPort: {context.Connection.LocalPort}{nl}");
            sb.Append($"ClientCert: {context.Connection.ClientCertificate}{nl}{nl}");

            sb.Append($"Identity{rule}");
            sb.Append($"User: {context.User.Identity.Name}{nl}");
            var scheme = await authSchemeProvider
                .GetSchemeAsync(IISDefaults.AuthenticationScheme);
            sb.Append($"DisplayName: {scheme?.DisplayName}{nl}{nl}");

            sb.Append($"Headers{rule}");
            foreach (var header in context.Request.Headers)
            {
                sb.Append($"{header.Key}: {header.Value}{nl}");
            }
            sb.Append(nl);

            sb.Append($"Websockets{rule}");
            if (context.Features.Get<IHttpUpgradeFeature>() != null)
            {
                sb.Append($"Status: Enabled{nl}{nl}");
            }
            else
            {
                sb.Append($"Status: Disabled{nl}{nl}");
            }

            sb.Append($"Configuration{rule}");
            foreach (var pair in config.AsEnumerable())
            {
                sb.Append($"{pair.Path}: {pair.Value}{nl}");
            }
            sb.Append(nl);

            sb.Append($"Environment Variables{rule}");
            var vars = System.Environment.GetEnvironmentVariables();
            foreach (var key in vars.Keys.Cast<string>().OrderBy(key => key, 
                StringComparer.OrdinalIgnoreCase))
            {
                var value = vars[key];
                sb.Append($"{key}: {value}{nl}");
            }

            context.Response.ContentType = "text/plain";
            await context.Response.WriteAsync(sb.ToString());
        });
    }
}

Déboguer des applications ASP.NET Core

Les liens suivants fournissent des informations sur le débogage ASP.NET Core applications.