Delen via


Problemen met ASP.NET Core-projecten oplossen en fouten opsporen

Door Rick Anderson

De volgende koppelingen bieden richtlijnen voor probleemoplossing:

.NET Core SDK-waarschuwingen

Zowel de 32-bits als de 64-bits versies van de .NET Core SDK zijn geïnstalleerd

In het dialoogvenster Nieuw project voor ASP.NET Core ziet u mogelijk de volgende waarschuwing:

Zowel 32-bits als 64-bits versies van de .NET Core SDK zijn geïnstalleerd. Alleen sjablonen uit de 64-bits versies die op C:\Program Files\dotnet\sdk\zijn geïnstalleerd, worden weergegeven.

Deze waarschuwing wordt weergegeven wanneer zowel 32-bits (x86) als 64-bits (x64) versies van de .NET Core SDK zijn geïnstalleerd. Veelvoorkomende redenen waarom beide versies kunnen worden geïnstalleerd, zijn onder andere:

  • U hebt het .NET Core SDK-installatieprogramma oorspronkelijk gedownload met behulp van een 32-bits computer, maar deze vervolgens gekopieerd en geïnstalleerd op een 64-bits computer.
  • De 32-bits .NET Core SDK is geïnstalleerd door een andere toepassing.
  • De verkeerde versie is gedownload en geïnstalleerd.

Verwijder de 32-bits .NET Core SDK om deze waarschuwing te voorkomen. Verwijderen uit het Configuratiescherm>Programma's en onderdelen>Verwijder of wijzig een programma. Als u begrijpt waarom de waarschuwing en de gevolgen ervan optreden, kunt u de waarschuwing negeren.

De .NET Core SDK is geïnstalleerd op meerdere locaties

In het dialoogvenster Nieuw project voor ASP.NET Core ziet u mogelijk de volgende waarschuwing:

De .NET Core SDK wordt op meerdere locaties geïnstalleerd. Alleen sjablonen van de SDK's die op C:\Program Files\dotnet\sdk\zijn geïnstalleerd, worden weergegeven.

U ziet dit bericht wanneer u ten minste één installatie van de .NET Core SDK in een map buiten C:\Program Files\dotnet\sdk\hebt. Dit gebeurt meestal wanneer de .NET Core SDK is geïmplementeerd op een computer met behulp van kopiëren/plakken in plaats van het MSI-installatieprogramma.

Verwijder alle 32-bits .NET Core SDK's en runtimes om deze waarschuwing te voorkomen. Verwijderen uit het Configuratiescherm>Programma's en onderdelen>Verwijder of wijzig een programma. Als u begrijpt waarom de waarschuwing en de gevolgen ervan optreden, kunt u de waarschuwing negeren.

Er zijn geen .NET Core SDK's gedetecteerd

  • In het dialoogvenster Nieuw project van Visual Studio voor ASP.NET Core ziet u mogelijk de volgende waarschuwing:

    Er zijn geen .NET Core SDK's gedetecteerd, zorg ervoor dat ze zijn opgenomen in de omgevingsvariabele PATH.

  • Wanneer u een dotnet opdracht uitvoert, wordt de waarschuwing weergegeven als:

    Het was niet mogelijk om geïnstalleerde dotnet-SDK's te vinden.

Deze waarschuwingen worden weergegeven wanneer de omgevingsvariabele PATH niet verwijst naar .NET Core SDK's op de computer. U kunt dit probleem als volgt oplossen:

  • Installeer de .NET Core SDK. Download het nieuwste installatieprogramma van .NET Downloads.
  • Controleer of de PATH omgevingsvariabele verwijst naar de locatie waar de SDK is geïnstalleerd (C:\Program Files\dotnet\ voor 64-bits/x64 of C:\Program Files (x86)\dotnet\ voor 32-bits/x86). Het SDK-installatieprogramma stelt normaal gesproken de PATH in. Installeer altijd dezelfde bitness-SDK's en runtimes op dezelfde computer.

Ontbrekende SDK na installatie van de .NET Core Hosting Bundle

Als u de .NET Core Hosting Bundle installeert, wordt de PATH .NET Core-runtime gewijzigd zodat deze verwijst naar de 32-bits versie (x86) van .NET Core (C:\Program Files (x86)\dotnet\). Dit kan leiden tot ontbrekende SDK's wanneer de 32-bits (x86) .NET Core-opdracht dotnet wordt gebruikt (er zijn geen .NET Core SDK's gedetecteerd). Om dit probleem op te lossen, verplaatst u C:\Program Files\dotnet\ naar een positie voor C:\Program Files (x86)\dotnet\ op de PATH.

Gegevens ophalen uit een app

Als een app in staat is om te reageren op aanvragen, kunt u de volgende gegevens van de app verkrijgen met behulp van middleware:

  • Aanvraag: Methode, schema, host, pathbase, pad, queryreeks, headers
  • Verbinding: Extern IP-adres, externe poort, lokaal IP-adres, lokale poort, clientcertificaat
  • Identity: Naam, weergavenaam
  • Configuratie-instellingen
  • Omgevingsvariabelen

Plaats de volgende middlewarecode aan het begin van de aanvraagverwerkingspijplijn van de Startup.Configure methode. De omgeving wordt gecontroleerd voordat de middleware wordt uitgevoerd om ervoor te zorgen dat de code alleen in de Development omgeving wordt uitgevoerd.

Haal de omgeving op uit de Environment eigenschap van WebApplication. Bijvoorbeeld in if (app.Environment.IsDevelopment()) de volgende voorbeeldcode.

using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.IISIntegration;
using System.Text;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthentication();

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

if (app.Environment.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.Services.
                       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}");
        var config = builder.Configuration;

         foreach (var pair in config.AsEnumerable())
        {
            sb.Append($"{pair.Key}: {pair.Value}{nl}"); 
        }
        sb.Append(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());
    });
}

app.Run();

Fouten opsporen in ASP.NET Core-apps

De volgende koppelingen bevatten informatie over foutopsporing ASP.NET Core-apps.

Door Rick Anderson

De volgende koppelingen bieden richtlijnen voor probleemoplossing:

.NET Core SDK-waarschuwingen

Zowel de 32-bits als de 64-bits versies van de .NET Core SDK zijn geïnstalleerd

In het dialoogvenster Nieuw project voor ASP.NET Core ziet u mogelijk de volgende waarschuwing:

Zowel 32-bits als 64-bits versies van de .NET Core SDK zijn geïnstalleerd. Alleen sjablonen uit de 64-bits versies die op C:\Program Files\dotnet\sdk\zijn geïnstalleerd, worden weergegeven.

Deze waarschuwing wordt weergegeven wanneer zowel 32-bits (x86) als 64-bits (x64) versies van de .NET Core SDK zijn geïnstalleerd. Veelvoorkomende redenen waarom beide versies kunnen worden geïnstalleerd, zijn onder andere:

  • U hebt het .NET Core SDK-installatieprogramma oorspronkelijk gedownload met behulp van een 32-bits computer, maar deze vervolgens gekopieerd en geïnstalleerd op een 64-bits computer.
  • De 32-bits .NET Core SDK is geïnstalleerd door een andere toepassing.
  • De verkeerde versie is gedownload en geïnstalleerd.

Verwijder de 32-bits .NET Core SDK om deze waarschuwing te voorkomen. Verwijderen uit het Configuratiescherm>Programma's en onderdelen>Verwijder of wijzig een programma. Als u begrijpt waarom de waarschuwing en de gevolgen ervan optreden, kunt u de waarschuwing negeren.

De .NET Core SDK is geïnstalleerd op meerdere locaties

In het dialoogvenster Nieuw project voor ASP.NET Core ziet u mogelijk de volgende waarschuwing:

De .NET Core SDK wordt op meerdere locaties geïnstalleerd. Alleen sjablonen van de SDK's die op C:\Program Files\dotnet\sdk\zijn geïnstalleerd, worden weergegeven.

U ziet dit bericht wanneer u ten minste één installatie van de .NET Core SDK in een map buiten C:\Program Files\dotnet\sdk\hebt. Dit gebeurt meestal wanneer de .NET Core SDK is geïmplementeerd op een computer met behulp van kopiëren/plakken in plaats van het MSI-installatieprogramma.

Verwijder alle 32-bits .NET Core SDK's en runtimes om deze waarschuwing te voorkomen. Verwijderen uit het Configuratiescherm>Programma's en onderdelen>Verwijder of wijzig een programma. Als u begrijpt waarom de waarschuwing en de gevolgen ervan optreden, kunt u de waarschuwing negeren.

Er zijn geen .NET Core SDK's gedetecteerd

  • In het dialoogvenster Nieuw project van Visual Studio voor ASP.NET Core ziet u mogelijk de volgende waarschuwing:

    Er zijn geen .NET Core SDK's gedetecteerd, zorg ervoor dat ze zijn opgenomen in de omgevingsvariabele PATH.

  • Wanneer u een dotnet opdracht uitvoert, wordt de waarschuwing weergegeven als:

    Het was niet mogelijk om geïnstalleerde dotnet-SDK's te vinden.

Deze waarschuwingen worden weergegeven wanneer de omgevingsvariabele PATH niet verwijst naar .NET Core SDK's op de computer. U kunt dit probleem als volgt oplossen:

  • Installeer de .NET Core SDK. Download het nieuwste installatieprogramma van .NET Downloads.
  • Controleer of de PATH omgevingsvariabele verwijst naar de locatie waar de SDK is geïnstalleerd (C:\Program Files\dotnet\ voor 64-bits/x64 of C:\Program Files (x86)\dotnet\ voor 32-bits/x86). Het SDK-installatieprogramma stelt normaal gesproken de PATH in. Installeer altijd dezelfde bitness-SDK's en runtimes op dezelfde computer.

Ontbrekende SDK na installatie van de .NET Core Hosting Bundle

Als u de .NET Core Hosting Bundle installeert, wordt de PATH .NET Core-runtime gewijzigd zodat deze verwijst naar de 32-bits versie (x86) van .NET Core (C:\Program Files (x86)\dotnet\). Dit kan leiden tot ontbrekende SDK's wanneer de 32-bits (x86) .NET Core-opdracht dotnet wordt gebruikt (er zijn geen .NET Core SDK's gedetecteerd). Om dit probleem op te lossen, verplaatst u C:\Program Files\dotnet\ naar een positie voor C:\Program Files (x86)\dotnet\ op de PATH.

Gegevens ophalen uit een app

Als een app in staat is om te reageren op aanvragen, kunt u de volgende gegevens van de app verkrijgen met behulp van middleware:

  • Aanvraag: Methode, schema, host, pathbase, pad, queryreeks, headers
  • Verbinding: Extern IP-adres, externe poort, lokaal IP-adres, lokale poort, clientcertificaat
  • Identity: Naam, weergavenaam
  • Configuratie-instellingen
  • Omgevingsvariabelen

Plaats de volgende middlewarecode aan het begin van de aanvraagverwerkingspijplijn van de Startup.Configure methode. De omgeving wordt gecontroleerd voordat de middleware wordt uitgevoerd om ervoor te zorgen dat de code alleen in de Development omgeving wordt uitgevoerd.

Gebruik een van de volgende methoden om de omgeving te verkrijgen:

  • Voeg IHostingEnvironment toe aan de Startup.Configure methode en controleer de omgeving met de lokale variabele. In de volgende voorbeeldcode ziet u deze benadering.

  • Wijs de omgeving toe aan een eigenschap in de Startup klasse. Controleer de omgeving met behulp van de eigenschap (bijvoorbeeld 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());
        });
    }
}

Fouten opsporen in ASP.NET Core-apps

De volgende koppelingen bevatten informatie over foutopsporing ASP.NET Core-apps.