1

我们有一个用 .NET Core 2.x 编写的连续 WebJob,过去几周一直运行良好。最近有人对这个 WebJob 进行了一些更改,并引入了一个 3rd 方 NuGet 包。现在,我无法启动 WebJob,因为它无法找到第 3 方库依赖项之一。

这是错误消息:

D:\local\Temp\jobs\continuous\Temp1\oitdncff.sfg>dotnet Temp1.dll
错误:
找不到应用程序依赖项清单 (Temp1.deps.json) 中指定的程序集:
包:'System.Drawing.Common ',版本:'4.5.0-preview1-25914-04'
路径:'runtimes/win/lib/netcoreapp2.0/System.Drawing.Common.dll'

在谷歌搜索这个问题时,我尝试了几件我发现的事情。这是 csproj 文件中的 PropertyGroup 和 ItemGroup(NuGet 包):

<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <ApplicationIcon />
    <StartupObject>Temp1.Program</StartupObject>
    <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
    <LangVersion>latest</LangVersion>
    <Version>1.0.0.0</Version>
    <PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
    <PackageReference Include="AsyncEnumerator" Version="2.1.0" />
    <PackageReference Include="EPPlus.Core" Version="1.5.4" />
    <PackageReference Include="Microsoft.ApplicationInsights" Version="2.5.1" />
    <PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" Version="2.5.1" />
    <PackageReference Include="Microsoft.Azure.ServiceBus" Version="2.0.0" />
    <PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.0-beta4" />
    <PackageReference Include="Microsoft.Azure.WebJobs.Logging.ApplicationInsights" Version="3.0.0-beta4" />
    <PackageReference Include="Microsoft.Azure.WebJobs.ServiceBus" Version="3.0.0-beta4" />
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.Logging" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.0.0" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.0.0" />
    <PackageReference Include="Newtonsoft.Json" Version="10.0.3" />
</ItemGroup>

根据在线建议,我添加了该行
<PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>

<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />

具有依赖关系的包是EPPlus.Core

我已经确认该库System.Drawing.Common确实存在于我们的 Azure Web 应用程序的 app 文件夹中,但是当 WebJob 启动时,它忽略了该文件存在并查看运行时 (GAC) 并失败。

更新: 我意识到 EPPlus.core 包不是官方的,所以切换到官方包希望这能解决错误。同样的错误,但新版本的System.Drawing.Common version: 4.5.0-preview1-26216-02

我已手动将 NuGet 包添加System.Drawing.Common version: 4.5.0-preview2-26406-04到项目中,这消除了原始错误,但随后我开始收到Microsoft.Win32.SystemEvents version: 4.5.0-preview2-26406-04无法找到的错误。该库依赖于System.Drawing.Common.

我尝试做与上面相同的事情,并将 NuGet 包Microsoft.Win32.SystemEvents version: 4.5.0-preview2-26406-04直接添加到项目中,但这次错误并没有消失。

进一步更新: 在搜索更多之后,我在这里看到了一篇关于发布然后压缩已发布目录并上传 zip 的帖子。这确实有效,有问题的错误消失了,但这并不是真正的解决方案。我们使用 VSTS 作为我们的 repo 系统和我们的 CI/CD。我将构建配置设置为发布,然后复制文件。WebJob 在通过此过程部署时会引发错误。

4

1 回答 1

0

首先,我想说的是,据我所知,截至今天,Azure WebJobs 并没有 100% 支持 .NET Core(如果我错了,请随时纠正我),但是有很多关于如何制作的文章和帖子他们工作。

下面是我为解决我遇到的上述问题而采取的解决方案,虽然我不觉得这很优雅,但我确实觉得微软做了一些奇怪的事情,大多数开发人员不会认为这是正确的路径。

我遇到问题的原因是当我构建(在调试或发布时)清单文件总是指向运行时(GAC)。在我的机器上本地运行从来都不是问题,因为可以找到文件。奇怪的是,在发布模式下构建时,所有文件都被复制到 bin 文件夹中,但清单仍然告诉程序查看运行时而不使用本地副本。当它被推送到 WebJob 本身时,这些文件在运行时中不存在,因此 WebJob 会抛出异常。

我必须做的解决方法如下:

  1. dotnet build(解决方案 - 发布配置)
  2. dotnet publish(仅限 WebJobs - 不压缩)
  3. dotnet publish(仅限 Web 项目 - 不压缩)
  4. 将 WebJob 数据从 Publish 复制到 Web 项目目录 \App_Data\jobs\continuous\ 目录
  5. 压缩 Web 项目发布目录(这是部署的内容)

我的诚实意见是,当我在发布模式下构建 webjob 项目时,该过程应该转换清单以在本地查找任何引用的库,然后再尝试在运行时中查找它们。

于 2018-05-02T13:51:09.590 回答