Partilhar via


Solucionar problemas e depurar projetos ASP.NET Core

Por Rick Anderson

Os links a seguir fornecem diretrizes para solução de problemas:

Avisos do SDK do .NET Core

As versões de 32 bits e 64 bits do SDK do .NET Core estão instaladas

Na caixa de diálogo Novo projeto para ASP.NET Core, você verá o seguinte aviso:

As versões de 32 bits e 64 bits do SDK do .NET Core estão instaladas. Apenas os modelos das versões de 64 bits instaladas em 'C:\Program Files\dotnet\sdk\' são exibidos.

Esse aviso aparece quando as versões de 32 bits (x86) e 64 bits (x64) do SDK do .NET Core estão instaladas. Os motivos comuns pelos quais ambas as versões podem ser instaladas incluem:

  • Você originalmente baixou o instalador do SDK do .NET Core usando uma máquina de 32 bits, mas depois copiou-o e instalou-o em uma máquina de 64 bits.
  • O .NET Core SDK de 32 bits foi instalado por outro aplicativo.
  • A versão errada foi descarregada e instalada.

Desinstale o SDK do .NET Core de 32 bits para evitar esse aviso. Desinstalar a partir do Painel de Controlo>Programas e Funcionalidades>Desinstale ou altere um programa. Se você entender por que o aviso ocorre e suas implicações, você pode ignorá-lo.

O SDK do .NET Core é instalado em vários locais

Na caixa de diálogo Novo projeto para ASP.NET Core, você verá o seguinte aviso:

O SDK do .NET Core é instalado em vários locais. Somente modelos dos SDKs instalados em 'C:\Program Files\dotnet\sdk\' são exibidos.

Você vê essa mensagem quando você tem pelo menos uma instalação do SDK do .NET Core em um diretório fora de C:\Program Files\dotnet\sdk\. Normalmente, isso acontece quando o SDK do .NET Core foi implantado em uma máquina usando copiar/colar em vez do instalador MSI.

Desinstale todos os SDKs e tempos de execução do .NET Core de 32 bits para evitar esse aviso. Desinstalar a partir do Painel de Controlo>Programas e Funcionalidades>Desinstale ou altere um programa. Se você entender por que o aviso ocorre e suas implicações, você pode ignorá-lo.

Nenhum SDK do .NET Core foi detetado

  • Na caixa de diálogo Visual Studio New Project para ASP.NET Core, você verá o seguinte aviso:

    Nenhum SDK do .NET Core foi detetado, certifique-se de que eles estejam incluídos na variável PATHde ambiente.

  • Ao executar um dotnet comando, o aviso aparece como:

    Não foi possível encontrar nenhum SDK do .NET instalado.

Esses avisos aparecem quando a variável PATH de ambiente não aponta para nenhum SDK do .NET Core no computador. Para resolver esse problema:

  • Instale o SDK do .NET Core. Baixe o instalador mais recente em Downloads do .NET.
  • Verifique se a PATH variável de ambiente aponta para o local onde o SDK está instalado (C:\Program Files\dotnet\ para 64 bits/x64 ou C:\Program Files (x86)\dotnet\ 32 bits/x86). O instalador do SDK normalmente define o PATH. Instale sempre os SDKs e tempos de execução com a mesma arquitetura na mesma máquina.

SDK ausente após a instalação do .NET Core Hosting Bundle

A instalação do .NET Core Hosting Bundle modifica o PATH momento em que instala o tempo de execução do .NET Core para apontar para a versão de 32 bits (x86) do .NET Core (C:\Program Files (x86)\dotnet\). Isso pode resultar em SDKs ausentes quando o comando .NET Core dotnet de 32 bits (x86) é usado (Nenhum SDK do .NET Core foi detetado). Para resolver esse problema, mova C:\Program Files\dotnet\ para uma posição antes C:\Program Files (x86)\dotnet\ no PATH.

Obter dados de um aplicativo

Se um aplicativo for capaz de responder a solicitações, você poderá obter os seguintes dados do aplicativo usando middleware:

  • Solicitação: Método, esquema, host, pathbase, caminho, cadeia de caracteres de consulta, cabeçalhos
  • Conexão: Endereço IP remoto, porta remota, endereço IP local, porta local, certificado do cliente
  • Identity: Nome, nome de exibição
  • Definições de configuração
  • Variáveis de ambiente

Coloque o seguinte código middleware no início do pipeline de processamento de requisições do método Startup.Configure. O ambiente é verificado antes da execução do middleware para garantir que o código é executado apenas no Development ambiente.

Obtenha o ambiente a Environment partir da propriedade de WebApplication. Por exemplo, if (app.Environment.IsDevelopment()) como no código de exemplo a seguir.

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

Depurar aplicativos ASP.NET Core

Os links seguintes fornecem informações sobre a depuração de aplicativos ASP.NET Core.

Por Rick Anderson

Os links a seguir fornecem diretrizes para solução de problemas:

Avisos do SDK do .NET Core

As versões de 32 bits e 64 bits do SDK do .NET Core estão instaladas

Na caixa de diálogo Novo projeto para ASP.NET Core, você verá o seguinte aviso:

As versões de 32 bits e 64 bits do SDK do .NET Core estão instaladas. Apenas os modelos das versões de 64 bits instaladas em 'C:\Program Files\dotnet\sdk\' são exibidos.

Esse aviso aparece quando as versões de 32 bits (x86) e 64 bits (x64) do SDK do .NET Core estão instaladas. Os motivos comuns pelos quais ambas as versões podem ser instaladas incluem:

  • Você originalmente baixou o instalador do SDK do .NET Core usando uma máquina de 32 bits, mas depois copiou-o e instalou-o em uma máquina de 64 bits.
  • O .NET Core SDK de 32 bits foi instalado por outro aplicativo.
  • A versão errada foi descarregada e instalada.

Desinstale o SDK do .NET Core de 32 bits para evitar esse aviso. Desinstalar a partir do Painel de Controlo>Programas e Funcionalidades>Desinstale ou altere um programa. Se você entender por que o aviso ocorre e suas implicações, você pode ignorá-lo.

O SDK do .NET Core é instalado em vários locais

Na caixa de diálogo Novo projeto para ASP.NET Core, você verá o seguinte aviso:

O SDK do .NET Core é instalado em vários locais. Somente modelos dos SDKs instalados em 'C:\Program Files\dotnet\sdk\' são exibidos.

Você vê essa mensagem quando você tem pelo menos uma instalação do SDK do .NET Core em um diretório fora de C:\Program Files\dotnet\sdk\. Normalmente, isso acontece quando o SDK do .NET Core foi implantado em uma máquina usando copiar/colar em vez do instalador MSI.

Desinstale todos os SDKs e tempos de execução do .NET Core de 32 bits para evitar esse aviso. Desinstalar a partir do Painel de Controlo>Programas e Funcionalidades>Desinstale ou altere um programa. Se você entender por que o aviso ocorre e suas implicações, você pode ignorá-lo.

Nenhum SDK do .NET Core foi detetado

  • Na caixa de diálogo Visual Studio New Project para ASP.NET Core, você verá o seguinte aviso:

    Nenhum SDK do .NET Core foi detetado, certifique-se de que eles estejam incluídos na variável PATHde ambiente.

  • Ao executar um dotnet comando, o aviso aparece como:

    Não foi possível encontrar nenhum SDK do .NET instalado.

Esses avisos aparecem quando a variável PATH de ambiente não aponta para nenhum SDK do .NET Core no computador. Para resolver esse problema:

  • Instale o SDK do .NET Core. Baixe o instalador mais recente em Downloads do .NET.
  • Verifique se a PATH variável de ambiente aponta para o local onde o SDK está instalado (C:\Program Files\dotnet\ para 64 bits/x64 ou C:\Program Files (x86)\dotnet\ 32 bits/x86). O instalador do SDK normalmente define o PATH. Instale sempre os SDKs e tempos de execução com a mesma arquitetura na mesma máquina.

SDK ausente após a instalação do .NET Core Hosting Bundle

A instalação do .NET Core Hosting Bundle modifica o PATH momento em que instala o tempo de execução do .NET Core para apontar para a versão de 32 bits (x86) do .NET Core (C:\Program Files (x86)\dotnet\). Isso pode resultar em SDKs ausentes quando o comando .NET Core dotnet de 32 bits (x86) é usado (Nenhum SDK do .NET Core foi detetado). Para resolver esse problema, mova C:\Program Files\dotnet\ para uma posição antes C:\Program Files (x86)\dotnet\ no PATH.

Obter dados de um aplicativo

Se um aplicativo for capaz de responder a solicitações, você poderá obter os seguintes dados do aplicativo usando middleware:

  • Solicitação: Método, esquema, host, pathbase, caminho, cadeia de caracteres de consulta, cabeçalhos
  • Conexão: Endereço IP remoto, porta remota, endereço IP local, porta local, certificado do cliente
  • Identity: Nome, nome de exibição
  • Definições de configuração
  • Variáveis de ambiente

Coloque o seguinte código middleware no início do pipeline de processamento de requisições do método Startup.Configure. O ambiente é verificado antes da execução do middleware para garantir que o código é executado apenas no Development ambiente.

Para obter o ambiente, pode usar uma das seguintes abordagens:

  • Injete o IHostingEnvironment no método Startup.Configure e verifique o ambiente com a variável local. O código de exemplo a seguir demonstra essa abordagem.

  • Atribua o ambiente a uma propriedade na Startup classe. Verifique o ambiente usando a propriedade (por exemplo, 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());
        });
    }
}

Depurar aplicativos ASP.NET Core

Os links seguintes fornecem informações sobre a depuração de aplicativos ASP.NET Core.