.NET Core 2.2 Blob上传应用部署Azure App Service程序集加载报错
.NET Core 2.2控制台应用部署Azure App Service抛出DiagnosticSource加载异常解决方案
根因分析
该报错是Azure App Service全局运行时依赖与项目Nuget依赖版本冲突导致:本地开发环境有完整的Nuget依赖缓存,程序运行时可以加载到匹配版本的System.Diagnostics.DiagnosticSource;部署到App Service后,控制台应用的依赖加载逻辑会优先调用平台预安装的低版本System.Diagnostics.DiagnosticSource,和Azure.Storage.Blobs要求的4.0.4.0版本不匹配,从而抛出程序集加载失败异常,问题触发点为BlobServiceClient storageAccount = new BlobServiceClient("connection string")初始化逻辑。
修复方案
- 方案1:强制发布所有依赖文件
在控制台项目的.csproj文件的PropertyGroup节点下添加如下配置,关闭运行时目标清单优化,发布时会将所有依赖的dll都打包到部署目录,运行时优先加载本地部署的版本,不会调用App Service的全局程序集:
<PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
修改配置后重新发布即可解决90%以上的该类依赖冲突问题。
- 方案2:添加程序集绑定重定向
如果方案1不生效,可以在发布生成的web.config文件的runtime/assemblyBinding节点下添加绑定重定向规则,强制所有版本的DiagnosticSource都指向4.0.4.0版本:
<dependentAssembly> <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.4.0" newVersion="4.0.4.0" /> </dependentAssembly>
- 方案3:迁移到ASP.NET Core项目
你已采用的将Azure存储调用逻辑迁移到ASP.NET Core项目的方案也可以解决该问题,ASP.NET Core项目的依赖加载逻辑会优先处理Nuget安装的版本,默认适配DiagnosticSource的版本绑定要求。
内容的提问来源于stack exchange,提问作者Mehdi Sheikh
相关产品推荐
相关产品推荐

