Dela via


Felsöka och debugga ASP.NET Core-projekt

Av Rick Anderson

Följande länkar innehåller felsökningsvägledning:

.NET Core SDK-varningar

Både 32-bitars- och 64-bitarsversionerna av .NET Core SDK är installerade

I dialogrutan Nytt projekt för ASP.NET Core kan följande varning visas:

Både 32-bitars- och 64-bitarsversioner av .NET Core SDK är installerade. Endast mallar från 64-bitarsversionerna som är installerade på "C:\Program Files\dotnet\sdk\" visas.

Den här varningen visas när både 32-bitarsversioner (x86) och 64-bitarsversioner (x64) av .NET Core SDK är installerade. Vanliga orsaker till att båda versionerna kan installeras är:

  • Du laddade ursprungligen ned installationsprogrammet för .NET Core SDK med hjälp av en 32-bitars dator men kopierade den sedan över och installerade den på en 64-bitarsdator.
  • 32-bitars .NET Core SDK installerades av ett annat program.
  • Fel version laddades ned och installerades.

Avinstallera 32-bitars .NET Core SDK för att förhindra den här varningen. Avinstallera från Kontrollpanelens>program och funktioner>Avinstallera eller ändra ett program. Om du förstår varför varningen inträffar och dess konsekvenser kan du ignorera varningen.

.NET Core SDK är installerat på flera platser

I dialogrutan Nytt projekt för ASP.NET Core kan följande varning visas:

.NET Core SDK är installerat på flera platser. Endast mallar från SDK:erna som är installerade på "C:\Program Files\dotnet\sdk\" visas.

Det här meddelandet visas när du har minst en installation av .NET Core SDK i en katalog utanför C:\Program Files\dotnet\sdk\. Detta inträffar vanligtvis när .NET Core SDK har distribuerats på en dator med kopiera/klistra in i stället för MSI-installationsprogrammet.

Avinstallera alla 32-bitars .NET Core SDK:er och körningar för att förhindra den här varningen. Avinstallera från Kontrollpanelens>program och funktioner>Avinstallera eller ändra ett program. Om du förstår varför varningen inträffar och dess konsekvenser kan du ignorera varningen.

Inga .NET Core SDK:er identifierades

  • I dialogrutan Nytt projekt i Visual Studio för ASP.NET Core kan följande varning visas:

    Inga .NET Core SDK:er har identifierats, se till att de ingår i miljövariabeln PATH.

  • När du kör ett dotnet kommando visas varningen som:

    Det gick inte att hitta några installerade dotnet-SDK:er.

Dessa varningar visas när miljövariabeln PATH inte pekar på några .NET Core SDK:er på datorn. Så här löser du problemet:

  • Installera .NET Core SDK. Hämta det senaste installationsprogrammet från .NET-nedladdningar.
  • Kontrollera att PATH miljövariabeln pekar på platsen där SDK:t är installerat (C:\Program Files\dotnet\ för 64-bitars/x64 eller C:\Program Files (x86)\dotnet\ för 32-bitars/x86). SDK-installationsprogrammet anger normalt PATH. Installera alltid samma bitness-SDK:er och körningar på samma dator.

SDK saknas efter att ha installerat .NET Core hosting-bundle

När du installerar .NET Core Hosting Bundle ändras PATH när .NET Core-körningen installeras så att den pekar på 32-bitarsversionen (x86) av .NET Core (C:\Program Files (x86)\dotnet\). Detta kan leda till att SDK:er saknas när kommandot 32-bitars (x86) .NET Core dotnet används (inga .NET Core SDK:er identifierades). Lös problemet genom att flytta C:\Program Files\dotnet\ till en position före C:\Program Files (x86)\dotnet\PATH.

Hämta data från en app

Om en app kan svara på begäranden kan du hämta följande data från appen med mellanprogram:

  • Begäran: Metod, schema, värd, sökvägsbas, sökväg, frågesträng, rubriker
  • Anslutning: Fjärr-IP-adress, fjärrport, lokal IP-adress, lokal port, klientcertifikat
  • Identity: Namn, visningsnamn
  • Konfigurationsinställningar
  • Miljövariabler

Placera följande mellanprogramskod i början av Startup.Configure-metodens pipeline för bearbetning av begäranden. Miljön kontrolleras innan mellanprogrammet körs för att säkerställa att koden endast körs i utvecklingsmiljön.

Hämta miljön från Environment egenskapen WebApplication. Till exempel, if (app.Environment.IsDevelopment()) som i följande exempelkod.

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();

Felsöka ASP.NET Core-appar

Följande länkar innehåller information om felsökning ASP.NET Core-appar.

Av Rick Anderson

Följande länkar innehåller felsökningsvägledning:

.NET Core SDK-varningar

Både 32-bitars- och 64-bitarsversionerna av .NET Core SDK är installerade

I dialogrutan Nytt projekt för ASP.NET Core kan följande varning visas:

Både 32-bitars- och 64-bitarsversioner av .NET Core SDK är installerade. Endast mallar från 64-bitarsversionerna som är installerade på "C:\Program Files\dotnet\sdk\" visas.

Den här varningen visas när både 32-bitarsversioner (x86) och 64-bitarsversioner (x64) av .NET Core SDK är installerade. Vanliga orsaker till att båda versionerna kan installeras är:

  • Du laddade ursprungligen ned installationsprogrammet för .NET Core SDK med hjälp av en 32-bitars dator men kopierade den sedan över och installerade den på en 64-bitarsdator.
  • 32-bitars .NET Core SDK installerades av ett annat program.
  • Fel version laddades ned och installerades.

Avinstallera 32-bitars .NET Core SDK för att förhindra den här varningen. Avinstallera från Kontrollpanelens>program och funktioner>Avinstallera eller ändra ett program. Om du förstår varför varningen inträffar och dess konsekvenser kan du ignorera varningen.

.NET Core SDK är installerat på flera platser

I dialogrutan Nytt projekt för ASP.NET Core kan följande varning visas:

.NET Core SDK är installerat på flera platser. Endast mallar från SDK:erna som är installerade på "C:\Program Files\dotnet\sdk\" visas.

Det här meddelandet visas när du har minst en installation av .NET Core SDK i en katalog utanför C:\Program Files\dotnet\sdk\. Detta inträffar vanligtvis när .NET Core SDK har distribuerats på en dator med kopiera/klistra in i stället för MSI-installationsprogrammet.

Avinstallera alla 32-bitars .NET Core SDK:er och körningar för att förhindra den här varningen. Avinstallera från Kontrollpanelens>program och funktioner>Avinstallera eller ändra ett program. Om du förstår varför varningen inträffar och dess konsekvenser kan du ignorera varningen.

Inga .NET Core SDK:er identifierades

  • I dialogrutan Nytt projekt i Visual Studio för ASP.NET Core kan följande varning visas:

    Inga .NET Core SDK:er har identifierats, se till att de ingår i miljövariabeln PATH.

  • När du kör ett dotnet kommando visas varningen som:

    Det gick inte att hitta några installerade dotnet-SDK:er.

Dessa varningar visas när miljövariabeln PATH inte pekar på några .NET Core SDK:er på datorn. Så här löser du problemet:

  • Installera .NET Core SDK. Hämta det senaste installationsprogrammet från .NET-nedladdningar.
  • Kontrollera att PATH miljövariabeln pekar på platsen där SDK:t är installerat (C:\Program Files\dotnet\ för 64-bitars/x64 eller C:\Program Files (x86)\dotnet\ för 32-bitars/x86). SDK-installationsprogrammet anger normalt PATH. Installera alltid samma bitness-SDK:er och körningar på samma dator.

SDK saknas efter att ha installerat .NET Core hosting-bundle

När du installerar .NET Core Hosting Bundle ändras PATH när .NET Core-körningen installeras så att den pekar på 32-bitarsversionen (x86) av .NET Core (C:\Program Files (x86)\dotnet\). Detta kan leda till att SDK:er saknas när kommandot 32-bitars (x86) .NET Core dotnet används (inga .NET Core SDK:er identifierades). Lös problemet genom att flytta C:\Program Files\dotnet\ till en position före C:\Program Files (x86)\dotnet\PATH.

Hämta data från en app

Om en app kan svara på begäranden kan du hämta följande data från appen med mellanprogram:

  • Begäran: Metod, schema, värd, sökvägsbas, sökväg, frågesträng, rubriker
  • Anslutning: Fjärr-IP-adress, fjärrport, lokal IP-adress, lokal port, klientcertifikat
  • Identity: Namn, visningsnamn
  • Konfigurationsinställningar
  • Miljövariabler

Placera följande mellanprogramskod i början av Startup.Configure-metodens pipeline för bearbetning av begäranden. Miljön kontrolleras innan mellanprogrammet körs för att säkerställa att koden endast körs i utvecklingsmiljön.

Använd någon av följande metoder för att hämta miljön:

  • IHostingEnvironment Mata in i Startup.Configure metoden och kontrollera miljön med den lokala variabeln. Följande exempelkod visar den här metoden.

  • Tilldela miljön till en egenskap i Startup klassen. Kontrollera miljön med hjälp av egenskapen (till exempel 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());
        });
    }
}

Felsöka ASP.NET Core-appar

Följande länkar innehåller information om felsökning ASP.NET Core-appar.