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

Jer*_*ney 3 webdeploy azure-web-app-service asp.net-core azure-pipelines asp.net-core-3.1

将项目从ASP.NET Core 3.0升级到ASP.NET Core 3.1后,我的应用程序停止在Azure App Services \xe2\x80\x94上运行,但仅在使用Azure DevOps Pipelines 的持续部署进行发布时停止运行。(与另一个问题类似,如果我直接从 Visual Studio 发布,它会继续工作。)

\n

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

\n
\n

500.31 ANCM 无法找到本机依赖项

\n

此问题的常见解决方案:

\n

找不到指定版本的 Microsoft.NetCore.App 或 Microsoft.AspNetCore.App。

\n
\n

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

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

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

\n

其他线程建议在 Windows 事件查看器(以及此处)中查找这些详细信息。由于这是 Azure 应用服务,因此我查看了应用服务日志。然而,这些仅包含上述错误的副本,没有任何进一步的详细信息。此外, Azure Application Insights中没有记录任何异常,这表明此错误是在加载 Application Insights 之前发生的。

\n

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

\n

Jer*_*ney 6

应用程序服务日志与Windows 事件查看器不同;它们将捕获异常,并且对于排除您未发现的错误很有用,但它们至少不会产生有关 ANCM 错误的附加信息。相反,您需要确保启用详细错误,以确保您也收到ANCM 检测到的特定错误

\n

启用详细错误

\n

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

\n
public class Startup {\n  \xe2\x80\xa6\n  public static void Configure(IApplicationBuilder app, IWebHostEnvironment env) {\n    if (env.IsDevelopment()) {\n      app.UseDeveloperExceptionPage();\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

注意:这样做会公开有关所有异常的详细信息,并可能导致潜在的安全漏洞。仅应在其他安全的开发环境中启用此功能,或作为面向公众的服务器上的临时故障排除技术。

\n
\n

检测到特定错误

\n

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

\n
\n

500.31 ANCM 无法找到本机依赖项

\n

此问题的常见解决方案:

\n

找不到指定版本的 Microsoft.NetCore.App 或 Microsoft.AspNetCore.App。

\n

ANCM 检测到的具体错误:

\n

错误:找不到应用程序依赖项清单 (Project.deps.json) 中指定的程序集:包:\'Microsoft.Data.SqlClient\',版本:\'1.0.19269.1\' 路径:\'runtimes/win/ lib/netcoreapp2.1/Microsoft.Data.SqlClient.dll\'

\n
\n

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

\n

解决问题

\n

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

\n

也就是说,我仍然不清楚为什么直接从 Visual Studio 发布时有效,但通过 Azure DevOps Pipeline 发布时失败。我知道使用 的各种标志时包含的依赖项可能存在细微差别,因此我的假设是 Visual Studio 和Azure 应用服务部署任务调用dotnet publish方式之间存在差异。dotnet publish

\n