Solucionar problemas e depurar projetos do ASP.NET Core

De Rick Anderson

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

Avisos do SDK do .NET Core

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

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

As versões de 32 e 64 bits do SDK do .NET Core são instaladas. Somente 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 de 64 bits (x64) do SDK do .NET Core são instaladas. Os motivos comuns pelos quais ambas as versões podem ser instaladas são:

  • Originalmente, você baixou o instalador do SDK do .NET Core usando um computador de 32 bits, mas depois o copiou e instalou em um computador de 64 bits.
  • O SDK do .NET Core de 32 bits foi instalado por outro aplicativo.
  • A versão errada foi baixada e instalada.

Desinstale o SDK do .NET Core de 32 bits para evitar esse aviso. Para desinstalar, acesse Painel de Controle>Programas e Recursos>Desinstalar ou alterar um programa. Se você entende por que o aviso ocorre e quais são as implicações, pode ignorar o aviso.

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

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

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

Você verá essa mensagem quando tiver 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 um computador usando a função de copiar/colar em vez do instalador MSI.

Desinstale todos os SDKs e runtimes do .NET Core de 32 bits para evitar esse aviso. Para desinstalar, acesse Painel de Controle>Programas e Recursos>Desinstalar ou alterar um programa. Se você entende por que o aviso ocorre e quais são as implicações, pode ignorar o aviso.

Nenhum SDK do .NET Core foi detectado

  • Na caixa de diálogo Novo Projeto do Visual Studio para o ASP.NET Core, você poderá ver o seguinte aviso:

    Nenhum SDK do .NET Core foi detectado, verifique se eles estão incluídos na variável de ambiente PATH.

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

    Não foi possível localizar nenhum SDK do dotnet instalado.

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

  • Instale o SDK do .NET Core. Obtenha o instalador mais recente em Downloads do .NET.
  • Verifique se a variável de ambiente PATH aponta para o local onde o SDK está instalado (C:\Program Files\dotnet\ para 64 bits/x64 ou C:\Program Files (x86)\dotnet\ para 32 bits/x86). O instalador do SDK normalmente define o PATH. Sempre instale os mesmos SDKs de bits e runtimes no mesmo computador.

SDK ausente após a instalação do pacote de hospedagem do .NET Core

A instalação do Pacote de Hospedagem do .NET Core modifica o PATH quando ele instala o runtime 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 dotnet do .NET Core de 32 bits (x86) for usado (Nenhum SDK do .NET Core foi detectado). Para resolver esse problema, mude C:\Program Files\dotnet\ para uma posição antes de C:\Program Files (x86)\dotnet\ em 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 o middleware:

  • Solicitação: método, esquema, host, base de caminho, 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 código de middleware a seguir no início do pipeline de processamento de solicitação do método Startup.Configure. O ambiente é verificado antes que o middleware seja executado para garantir que o código seja executado apenas no ambiente de desenvolvimento.

Para obter o ambiente, use uma das seguintes abordagens:

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

  • Atribua o ambiente a uma propriedade na classe Startup. 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 a seguir fornecem informações sobre a depuração de aplicativos do ASP.NET Core.