网络工作:找不到图书馆

时间:2018-04-25 11:24:17

标签: c# azure azure-webjobs epplus azure-webjobs-continuous

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

这是错误消息:

  

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上的app文件夹中,但是当WebJob启动时,它忽略了该文件存在并查看运行时(GAC)和失败。

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

的新版本

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

我尝试做同样的事情,然后将Microsoft.Win32.SystemEvents version: 4.5.0-preview2-26406-04的NuGet包直接添加到项目中,但这次错误不会消失。

进一步更新: 在搜索了更多内容之后,我发现了一个帖子here,其中讨论了发布,然后压缩已发布的目录并上传了zip。这确实有效,有问题的错误消失了,但这不是一个真正的解决方案。我们使用VSTS作为我们的回购系统和CI / CD。我有构建配置集来进行发布,然后复制文件。 WebJob在通过此过程部署时会抛出错误。

1 个答案:

答案 0 :(得分:0)

首先,我想说到今天,据我所知,.NET Core并不是100%支持Azure WebJobs(如果我错了,请随时纠正我)但是有很多文章和帖子如何使它们发挥作用。

以下是我解决上述问题的解决方案,虽然我不觉得这很优雅,但我觉得微软已经做了一些奇怪的事情,大多数开发人员认为这不是正确的道路。

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

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

  1. dotnet build(解决方案 - 发布配置)
  2. dotnet发布(仅限WebJobs - 不要压缩)
  3. dotnet publish(仅限Web项目 - 不要压缩)
  4. 将WebJob数据从发布复制到Web项目目录\ App_Data \ jobs \ continuous \目录
  5. Zip Up Web Project Published Directory(这是部署的内容)
  6. 我的诚实观点是,当我在发布模式下构建一个webjob项目时,该进程应该转换清单,以便在尝试在运行时查找它们之前在本地查找任何引用的库。