将项目从ASP.NET Core 3.0升级到ASP.NET Core 3.1后,我的应用程序停止在Azure App Services上运行,但仅在使用从Azure DevOps Pipelines进行连续部署发布时才停止。(与另一个问题类似,如果我直接从Visual Studio发布,它将继续起作用。)
具体来说,管道仍然可以使用Azure App Service Deploy(AzureRmWebAppDeployment
)任务进行发布,但无法在Azure App Service环境中加载,但有500.32例外:
500.31 ANCM无法找到本地依赖项
此问题的常见解决方案:
找不到指定的版本的Microsoft.NetCore.App或Microsoft.AspNetCore.App。
现在,对于未安装.NET Runtime的情况,我非常熟悉此错误,这在Microsoft发布新版本后立即很常见。在这些情况下,典型的解决方案是:
--self-contained
应用程序的版本,或发布到在这种情况下,我知道App Services环境中可以使用.NET Core 3.1.2运行时,并且还确认这些解决方案不能解决问题。这表明存在其他潜在错误。
其他线程建议在Windows事件查看器(以及此处)中查找那些详细信息。由于这是Azure应用服务,因此我查看了“应用服务日志”。这些仅包括上述错误的副本,但是没有任何更多详细信息。此外,Azure Application Insights中没有记录任何异常,表明此错误是在加载Application Insights之前发生的。
鉴于此,我的问题是:如何解决Azure App Service上的500.31错误?
该应用程序服务日志都没有类似于Windows事件查看器; 它们将捕获异常,并且对于排除您没有看到的错误很有用,但是至少它们不会为ANCM错误提供其他信息。取而代之的是,您需要确保启用了详细的错误,以确保您还可以获取ANCM检测到的特定错误。
在ASP.NET Core应用程序中,可以使用类中的UseDeveloperExceptionPage()
中间件来启用详细的错误Startup
。在标准ASP.NET Core模板中,可以根据环境变量有条件地切换它们:
public class Startup {
…
public static void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
}
}
}
在这种情况下,您只需要将App Service配置的ASPNETCORE_ENVIRONMENT
配置变量更改为即可Development
。
注意:这样做会暴露所有异常的详细信息,并可能导致潜在的安全漏洞。仅应在其他情况下确保安全的开发环境中启用此功能,或将其作为面向公众的服务器上的临时故障排除技术启用。
就我而言,这暴露了以下内容:
500.31 ANCM无法找到本地依赖项
此问题的常见解决方案:
找不到指定的版本的Microsoft.NetCore.App或Microsoft.AspNetCore.App。
ANCM检测到的特定错误:
错误:未找到在应用程序依赖项清单(Project.deps.json)中指定的程序集:软件包:'Microsoft.Data.SqlClient',版本:'1.0.19269.1'路径:'runtimes / win / lib / netcoreapp2.1 /Microsoft.Data.SqlClient.dll'
现在,您的应用程序正在寻找的确切基础依赖关系可能会有所不同。但是关键点在于,即使它能够加载正确的.NET Runtime(在我的情况下为.NET Core 3.1),它仍在尝试从.NET Core 2.1运行时加载旧版依赖项,从而触发此错误。但是,除非首先启用,否则您将无法确定该依赖关系对Azure App Service的影响UseDeveloperExceptionPage()
。
实际的解决方案显然取决于您收到的确切错误。在这种情况下,提供对最新NuGet程序包的明确引用可以Microsoft.Data.SqlClient
解决此问题,并允许Azure App Service正确显示站点。
就是说,我仍然不清楚为什么在直接从Visual Studio直接发布时可以奏效,但是在通过Azure DevOps Pipeline发布时失败了。我知道使用各种标志时包含的依赖项之间可能会有细微的差异dotnet publish
,因此我的假设是Visual Studio和Azure App Service Deploy任务调用的方式之间存在差异dotnet publish
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句