【问题标题】:.NET Core 3.1 web API builds fine locally, but gets errors when deploying via Azure DevOps.NET Core 3.1 Web API 在本地构建良好,但在通过 Azure DevOps 部署时出错
【发布时间】:2020-12-17 12:42:35
【问题描述】:

几周前我遇到了类似的问题:

I'm getting the error "Microsoft.AspNetCore.Hosting.Abstractions, Version=3.1.0.0" in .NET Core 3.1 app

我可以在本地从 Visual Studio 2019 运行它,没有任何问题,但是每当我在通过 Azure DevOps 部署后尝试运行它时,我都会收到以下错误:

Unhandled exception. System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The located assembly's manifest definition does not match the assembly reference. (0x80131040)
File name: 'Microsoft.Extensions.DependencyInjection.Abstractions, Version=5.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'
   at System.Signature.GetSignature(Void* pCorSig, Int32 cCorSig, RuntimeFieldHandleInternal fieldHandle, IRuntimeMethodInfo methodHandle, RuntimeType declaringType)
   at System.Reflection.RuntimeMethodInfo.get_ReturnType()
   at Microsoft.AspNetCore.Hosting.StartupLoader.FindMethod(Type startupType, String methodName, String environmentName, Type returnType, Boolean required)
   at Microsoft.AspNetCore.Hosting.StartupLoader.HasConfigureServicesIServiceProviderDelegate(Type startupType, String environmentName)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.UseStartup(Type startupType, HostBuilderContext context, IServiceCollection services)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass12_0.<UseStartup>b__0(HostBuilderContext context, IServiceCollection services)
   at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
   at Microsoft.Extensions.Hosting.HostBuilder.Build()
   at KindRegards.Web.Api.Program.Main(String[] args) in /home/vsts/work/1/s/src/Api/Program.cs:line 10

我不完全理解所有这些是如何联系在一起的,所以我尝试添加:

    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0" />

但这没有用。我有其他使用 3.1.8 版的“Microsoft.Extension”包,所以我尝试通过添加来匹配它们:

    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.8" />

但是后来我无法在本地运行它,我得到了这个错误:

NU1605  Detected package downgrade: Microsoft.Extensions.DependencyInjection.Abstractions from 5.0.0 to 3.1.8. Reference the package directly from the project to select a different version. 
 KindRegards.Web.Api -> KindRegards.Plugins.PaymentProcessors.GreenMoney -> Microsoft.Extensions.Http 5.0.0 -> Microsoft.Extensions.DependencyInjection.Abstractions (>= 5.0.0) 
 KindRegards.Web.Api -> Microsoft.Extensions.DependencyInjection.Abstractions (>= 3.1.8)    Web.Api Z:\Projects\KindRegards\src\Api\Web.Api.csproj  1   

我什至不知道如何开始深入研究。任何帮助将不胜感激。

【问题讨论】:

  • 您的部署模式设置为什么?当我切换到 .NET 5.0 并升级我们解决方案中的所有 nuget 包时,我不得不将部署模式设置更改为“框架依赖”而不是“自包含”。我不得不手动擦除服务器目录,然后重新部署更改。可以检查您的部署模式吗?
  • 我对使用 DevOps + Azure 比较陌生,所以我不确定在哪里可以找到它。
  • 在我的本地 Visual Studio 中通过 Publish 部署它时遇到问题。不管出于什么原因,DevOps 没有更新服务器上的 .dll 版本,所以我手动将其全部删除。然后我从本地发布并注意到它复制了我什至不使用的各种东西到我的服务器。我注意到发布设置是“selfcontained=true”,它应该是假的,否则它会将许多错误的 .dll 复制到目的地。值得检查一下您的内容是如何发布的,即使是来自 DevOps。这在 .NET 5.0 迁移中对我们不利。在本地查找 .pubxml 文件或在 DevOps 上发布任务。
  • 当“selfcontained=true”从我​​的本地 VS 发布时,它复制了数百个尚未使用 .NET 5.0 的 .NET Framework .dll。一旦我告诉它部署模式“依赖于框架”而不是“自包含”,我的 .NET 5.0 应用程序就开始工作并真正使用带有 .NET 5.0 的 NuGet 包(这让我们愚弄了几天)。在检查了这些更改之后,即使从 DevOps 的角度来看,它似乎仍然有效。我也从来不需要处理部署模式,但显然 .NET 5.0 打破了它,至少对我的团队来说是这样。

标签: c# .net-core


【解决方案1】:

我之前在使用Azure DevOps时发生过这种情况,解决方案是检查Azure DevOps使用的是什么,我将项目与之匹配,我的意思是你的目标应该是Azure DevOps代理的版本使用。

我不记得确切,但很可能我降级了我的应用程序版本以匹配 Azure DevOps。

这通常在启用 Visual Studio 自动更新时发生,因此您的 .Net Core nuget 比 Azure DevOps 中使用的更新更新

【讨论】:

  • “构建管道”构建解决方案很好,我没有收到任何错误。然后我使用“发布管道”部署该工件。我只有在部署后尝试启动构建结果后才会收到错误消息。
  • @Jason Thuli 您尝试在哪里发布?蔚蓝?
  • 我已经尝试过 2. Azure App Service 和 Digital Ocean droplet。两者都使用 Linux 托管。
  • @JasonThuli 检查您的发布管道任务设置。它可能是“自包含”的,这会导致非 5.0 的 dll 被继承,从而导致版本冲突
  • @JasonThuli 您是否查看过工件并确认存在正确的版本?服务器上是否安装了 .NET 5.0?如果您查看您的工件/输出,那里是否有额外的垃圾(例如您不认识或您的应用不使用的 mbs 价值的东西?)。
【解决方案2】:

看来您创建了面向 .Net 5 的项目,这很棒。以最初的方式恢复您的项目,并在安装 .Net 5.0.100 的管道中添加另一个步骤。我认为下面的链接可能会有所帮助。

Azure Pipeline Failing in dotnet build, need to upgrade to latest .net core version

【讨论】:

  • 所以,这就是它令人困惑的原因。由于一些 3rd 方依赖项尚未升级,我们无法升级到 .NET 5。此外,我们的构建管道使用的是 3.1.x,并且它成功了。直到我尝试从服务器运行站点(这显然是在 DevOps 上的构建管道之后),我才收到错误。
猜你喜欢
  • 2020-05-27
  • 1970-01-01
  • 2021-01-25
  • 2019-08-03
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
相关资源
最近更新 更多