Azure 应用服务上的 500.31 ANCM 故障排除

Troubleshooting 500.31 ANCM on Azure App Service

将项目从 ASP.NET Core 3.0 升级到 ASP.NET Core 3.1 后,我的应用程序停止工作在 Azure App Services 上——但 使用来自 Azure DevOps 的持续部署 发布时管道。 (Similar to another question,如果我直接从 Visual Studio 发布,它会继续工作。)

具体来说,管道仍然能够使用 Azure App Service Deploy (AzureRmWebAppDeployment) 任务进行发布,但无法在 Azure App Service 环境中加载500.32 exception:

500.31 ANCM Failed to Find Native Dependencies

Common solutions to this issue:

The specified version of Microsoft.NetCore.App or Microsoft.AspNetCore.App was not found.

现在,对于未安装 .NET 运行时的情况,我非常熟悉此错误,这在 Microsoft 发布新版本后立即很常见。在这些情况下,典型的解决方案是:

  1. 作为应用程序的 --self-contained 版本发布,或发布到
  2. 启用适当的运行时作为 应用程序服务扩展,如果可用。

在这种情况下,我知道.NET Core 3.1.2 运行时在应用服务环境中可用,并且还确认这些解决方案无法解决问题.这表明存在不同的潜在错误。

Other threads suggest looking for those details in the Windows Event Viewer (and here as well)。由于这是一个 Azure 应用服务,因此我查看了 应用服务日志 。那些只包含上述错误的副本,但是没有任何进一步的详细信息。此外,Azure Application Insights 中没有记录异常,表明此错误发生在 Application Insights 加载之前。

鉴于此,我的问题是:如何解决 Azure 应用服务上的 500.31 错误?

应用程序服务日志Windows事件查看器不同;它们将捕获异常,并有助于解决您未曾目睹的错误,但它们至少不会为 ANCM 错误提供额外信息。相反,您需要确保启用了详细错误,以确保您也收到 ANCM.

检测到的 特定错误

启用详细错误

在 ASP.NET 核心应用程序中,可以使用 Startup class 中的 UseDeveloperExceptionPage() 中间件启用详细错误。在标准 ASP.NET 核心模板中,它们可以根据环境变量有条件地切换:

public class Startup {
  …
  public static void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
    if (env.IsDevelopment()) {
      app.UseDeveloperExceptionPage();
    }
  }
}

在这种情况下,您只需将应用服务配置的 ASPNETCORE_ENVIRONMENT 配置变量更改为 Development

Note: Doing this exposes details about all exceptions and can lead to potential security vulnerabilities. This should only be enabled for otherwise-secured development environments, or as a temporary troubleshooting technique on a public-facing server.

检测到特定错误

就我而言,这暴露了以下内容:

500.31 ANCM Failed to Find Native Dependencies

Common solutions to this issue:

The specified version of Microsoft.NetCore.App or Microsoft.AspNetCore.App was not found.

Specific error detected by ANCM:

Error: An assembly specified in the application dependencies manifest (Project.deps.json) was not found: package: 'Microsoft.Data.SqlClient', version: '1.0.19269.1' path: 'runtimes/win/lib/netcoreapp2.1/Microsoft.Data.SqlClient.dll'

现在,您的应用程序正在寻找的确切的底层依赖关系可能会有所不同。但关键是,即使它能够加载正确的 .NET 运行时(在我的例子中是 .NET Core 3.1),它仍在尝试从 .NET Core 2.1 运行时加载遗留依赖项,从而触发此错误。但是,除非您首先启用 UseDeveloperExceptionPage().

,否则您将无法确定该依赖项对 Azure 应用服务的依赖性。

解决问题

实际的解决方案显然取决于您收到的确切错误。在这种情况下,提供对最新 Microsoft.Data.SqlClient NuGet 包的 显式 引用可以解决问题,并允许 Azure 应用服务正确显示站点。

也就是说,我仍然不清楚为什么这在直接从 Visual Studio 发布时有效,但在通过 Azure DevOps 管道发布时失败。我知道在使用 dotnet publish 的各种标志时,所包含的依赖项可能存在细微差别,因此我的假设是 Visual Studio 和 Azure App Service Deploy任务调用dotnet publish.

在我们的例子中,它是应用服务上的一个日志扩展,需要更新到 dotnet 5。