Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Por Rick Anderson
Os links a seguir fornecem diretrizes para solução de problemas:
- Solucionar problemas do ASP.NET Core no Serviço de Aplicativo do Azure e no IIS
- Solução de problemas de erro comum para o Serviço de Aplicativo do Azure e o IIS com ASP.NET Core
- Conferência NDC (Londres, 2018): Diagnosticando problemas em ASP.NET Aplicações Principais
- ASP.NET Blog: Solução de problemas de desempenho no ASP.NET Core
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
dotnetcomando, 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
PATHvariável de ambiente aponta para o local onde o SDK está instalado (C:\Program Files\dotnet\para 64 bits/x64 ouC:\Program Files (x86)\dotnet\32 bits/x86). O instalador do SDK normalmente define oPATH. 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.
- Depurando ASP Core no Linux
- Debugging .NET Core no Unix via SSH
- Guia de início rápido: depurar ASP.NET com o depurador do Visual Studio
- Consulte este problema do GitHub para obter mais informações de depuração.
Por Rick Anderson
Os links a seguir fornecem diretrizes para solução de problemas:
- Solucionar problemas do ASP.NET Core no Serviço de Aplicativo do Azure e no IIS
- Solução de problemas de erro comum para o Serviço de Aplicativo do Azure e o IIS com ASP.NET Core
- Conferência NDC (Londres, 2018): Diagnosticando problemas em ASP.NET Aplicações Principais
- ASP.NET Blog: Solução de problemas de desempenho no ASP.NET Core
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
dotnetcomando, 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
PATHvariável de ambiente aponta para o local onde o SDK está instalado (C:\Program Files\dotnet\para 64 bits/x64 ouC:\Program Files (x86)\dotnet\32 bits/x86). O instalador do SDK normalmente define oPATH. 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
IHostingEnvironmentno métodoStartup.Configuree 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
Startupclasse. 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.
- Depurando ASP Core no Linux
- Debugging .NET Core no Unix via SSH
- Guia de início rápido: depurar ASP.NET com o depurador do Visual Studio
- Consulte este problema do GitHub para obter mais informações de depuração.