ASP.NET Core 项目故障排除和调试Troubleshoot and debug ASP.NET Core projects

本文内容

作者:Rick Anderson

以下链接提供了故障排除指南:

.NET Core SDK 警告.NET Core SDK warnings

同时安装了 .NET Core SDK 的 32 位和 64 位版本Both the 32-bit and 64-bit versions of the .NET Core SDK are installed

在 ASP.NET Core 的“新建项目”对话框中,可能会显示以下警告 :


同时安装了 .NET Core SDK 的 32 位和 64 位版本。 仅显示安装在 C:\Program Files\dotnet\sdk\ 的 64 位版本的模板。


如果同时安装了 .NET Core SDK 的 32 位 (x86) 和 64 位 (x64) 版本,则会出现此警告。可能同时安装两个版本的常见原因包括:

  • 最初使用 32 位计算机下载了 .NET Core SDK 安装程序,然后将其复制并安装到 64 位计算机上。
  • 32 位 .NET Core SDK 是由另一个应用程序安装的。
  • 下载并安装了错误的版本。

卸载 32 位 .NET Core SDK 以避免出现此警告。从“控制面板” > “程序和功能” > “卸载或更改程序”卸载 。如果了解警告出现的原因及其含义,可以忽略此警告。

.NET Core SDK 安装在多个位置The .NET Core SDK is installed in multiple locations

在 ASP.NET Core 的“新建项目”对话框中,可能会显示以下警告 :


.NET Core SDK 安装在多个位置。 仅显示安装在 C:\Program Files\dotnet\sdk\ 的 SDK 的模板。


如果在 C:\Program Files\dotnet\sdk\ 之外的目录中至少安装了一个 .NET Core SDK,则会看到此消息 。发生这种情况,通常是由于使用复制/粘贴而不是 MSI 安装程序在计算机上部署了 .NET Core SDK。

卸载所有 32 位 .NET Core SDK 和运行时,以防出现此警告。从“控制面板” > “程序和功能” > “卸载或更改程序”卸载 。如果了解警告出现的原因及其含义,可以忽略此警告。

未检测到 .NET Core SDKNo .NET Core SDKs were detected

  • 在 Visual Studio 中,ASP.NET Core 的“新建项目”对话框中可能会显示以下警告 :

未检测到任何 .NET Core SDK,请确保它们包含在环境变量 PATH 中。


  • 执行 dotnet 命令时,警告显示为:

找不到任何已安装的 dotnet SDK。


如果环境变量 PATH 不指向计算机上的任何 .NET Core SDK,则会出现这些警告。若要解决此问题,请执行以下操作:

  • 安装 .NET Core SDK。从 .NET 下载获取最新的安装程序。
  • 验证 PATH 环境变量是否指向安装 SDK 的位置(对于 64 位/x64,为 C:\Program Files\dotnet\,对于 32 位/x86,为 C:\Program Files (x86)\dotnet\)。SDK 安装程序通常会设置 PATH。始终在同一台计算机上安装相同位数的 SDK 和运行时。

安装 .NET Core 托管捆绑包后缺少 SDKMissing SDK after installing the .NET Core Hosting Bundle

如果安装了 .NET Core 运行时以指向 32 位 (x86) 版本的 .NET Core (C:\Program Files (x86)\dotnet\),那么安装 .NET Core 托管捆绑包会修改 PATH当使用 32 位 (x86) .NET Core dotnet 命令时,这可能会导致缺少 SDK(未检测到 .NET Core SDK)。若要解决此问题,请将 C:\Program Files\dotnet\ 移到 PATHC:\Program Files (x86)\dotnet\ 之前的位置。

从应用中获取数据Obtain data from an app

如果某个应用能够响应请求,则可以使用中间件从应用获取以下数据:

  • 请求 – 方法、方案、主机、基路径、路径、查询字符串、标头
  • 连接 – 远程 IP 地址、远程端口、本地 IP 地址、本地端口、客户端证书
  • 标识 – 名称、显示名称
  • 配置设置
  • 环境变量

将以下中间件代码置于 Startup.Configure 方法的请求处理管道的开头。在运行中间件之前会检查环境,以确保仅在开发环境中执行代码。

若要获取环境,请使用以下方法之一:

  • IHostingEnvironment 插入到 Startup.Configure 方法中,并检查带有本地变量的环境。下面的示例代码对此方法进行了演示。

  • 将环境分配到 Startup 类中的属性。使用属性(例如 if (Environment.IsDevelopment()))检查环境。

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env,
  2. IConfiguration config)
  3. {
  4. if (env.IsDevelopment())
  5. {
  6. app.Run(async (context) =>
  7. {
  8. var sb = new StringBuilder();
  9. var nl = System.Environment.NewLine;
  10. var rule = string.Concat(nl, new string('-', 40), nl);
  11. var authSchemeProvider = app.ApplicationServices
  12. .GetRequiredService<IAuthenticationSchemeProvider>();
  13. sb.Append($"Request{rule}");
  14. sb.Append($"{DateTimeOffset.Now}{nl}");
  15. sb.Append($"{context.Request.Method} {context.Request.Path}{nl}");
  16. sb.Append($"Scheme: {context.Request.Scheme}{nl}");
  17. sb.Append($"Host: {context.Request.Headers["Host"]}{nl}");
  18. sb.Append($"PathBase: {context.Request.PathBase.Value}{nl}");
  19. sb.Append($"Path: {context.Request.Path.Value}{nl}");
  20. sb.Append($"Query: {context.Request.QueryString.Value}{nl}{nl}");
  21. sb.Append($"Connection{rule}");
  22. sb.Append($"RemoteIp: {context.Connection.RemoteIpAddress}{nl}");
  23. sb.Append($"RemotePort: {context.Connection.RemotePort}{nl}");
  24. sb.Append($"LocalIp: {context.Connection.LocalIpAddress}{nl}");
  25. sb.Append($"LocalPort: {context.Connection.LocalPort}{nl}");
  26. sb.Append($"ClientCert: {context.Connection.ClientCertificate}{nl}{nl}");
  27. sb.Append($"Identity{rule}");
  28. sb.Append($"User: {context.User.Identity.Name}{nl}");
  29. var scheme = await authSchemeProvider
  30. .GetSchemeAsync(IISDefaults.AuthenticationScheme);
  31. sb.Append($"DisplayName: {scheme?.DisplayName}{nl}{nl}");
  32. sb.Append($"Headers{rule}");
  33. foreach (var header in context.Request.Headers)
  34. {
  35. sb.Append($"{header.Key}: {header.Value}{nl}");
  36. }
  37. sb.Append(nl);
  38. sb.Append($"Websockets{rule}");
  39. if (context.Features.Get<IHttpUpgradeFeature>() != null)
  40. {
  41. sb.Append($"Status: Enabled{nl}{nl}");
  42. }
  43. else
  44. {
  45. sb.Append($"Status: Disabled{nl}{nl}");
  46. }
  47. sb.Append($"Configuration{rule}");
  48. foreach (var pair in config.AsEnumerable())
  49. {
  50. sb.Append($"{pair.Path}: {pair.Value}{nl}");
  51. }
  52. sb.Append(nl);
  53. sb.Append($"Environment Variables{rule}");
  54. var vars = System.Environment.GetEnvironmentVariables();
  55. foreach (var key in vars.Keys.Cast<string>().OrderBy(key => key,
  56. StringComparer.OrdinalIgnoreCase))
  57. {
  58. var value = vars[key];
  59. sb.Append($"{key}: {value}{nl}");
  60. }
  61. context.Response.ContentType = "text/plain";
  62. await context.Response.WriteAsync(sb.ToString());
  63. });
  64. }
  65. }

调试 ASP.NET Core 应用Debug ASP.NET Core apps

以下链接提供有关调试 ASP.NET Core 应用的信息。