Azure Functions Newtonsoft.Json 加载错误

Posted

技术标签:

【中文标题】Azure Functions Newtonsoft.Json 加载错误【英文标题】:Azure Functions Newtonsoft.Json load error 【发布时间】:2018-12-20 14:28:33 【问题描述】:

这快把我逼疯了。我在使用 Newtonsoft.Json 的 Azure 函数时遇到加载错误。

这是一个 .netstandard2.0 项目,我安装了 11.0.2 版本。我在网上看过,大多数其他人都在使用旧版本的 Microsoft.NET.Sdk.Functions:1.0.13 但我使用的是 1.0.14

在下面查看我的项目文件:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <AzureFunctionsVersion>v2</AzureFunctionsVersion>
    <RootNamespace>modoapi</RootNamespace>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Autofac" Version="4.2.1" />
    <PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.0-beta5" />
    <PackageReference Include="Microsoft.Azure.WebJobs.ServiceBus" Version="3.0.0-beta5" />
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.14" />
    <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
</Project>

我查看了我的项目的所有依赖项,它们都指向 Newtonsoft.Json 11.0.2。

该文件存在于我的输出 bin 文件夹中。我已经清理了解决方案。更新到最新的 VS 和 Azure Functions 和 WebJobs 工具 15.0.40608.0

Function App 启动正常,但是当我将消息添加到队列以调用触发器时,我在控制台中收到以下错误。

[12/07/2018 10:56:36] 执行“ExecuteWorkItem”(失败, id=6d87f5e9-c331-4934-a3f3-b9bebf756b54) [12/07/2018 10:56:36] System.Private.CoreLib:执行功能时出现异常: 执行工作项。 test-api: 无法加载文件或程序集 'Newtonsoft.Json,版本=11.0.0.0,文化=中性, PublicKeyToken=30ad4fe6b2a6aeed'。无法找到或加载特定的 文件。 (来自 HRESULT 的异常:0x80131621)。 System.Private.CoreLib: 无法加载文件或程序集'Newtonsoft.Json,版本 = 11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'。

这是我的函数的签名

public static class ExecuteWorkItem

    [FunctionName("ExecuteWorkItem")]
    public static async Task Run(
        [QueueTrigger("work-item")]string queueItem,
        TraceWriter log,
        ExecutionContext executionContext,
        [Inject(typeof(IWorkItemEngine))]IWorkItemEngine workItemEngine,
        [Table("ResultData", Connection = "AzureWebJobsStorage")] CloudTable resultTable,
        [Table("SimulationNodeData", Connection = "AzureWebJobsStorage")] CloudTable simulationNodeTable)
    

任何想法现在都会非常感激,唯一似乎遇到类似问题的人就是这里的这个人:Go to the bottom of his post

他没有回复他的询问,他使用的是 Mac 环境,而我使用的是 Windows 10。

任何帮助将不胜感激。

提前致谢

【问题讨论】:

顺便说一句,我正在使用 Autofac 进行依赖注入。 Autofac 似乎没有提到 Newtonsoft.Json。但为了证明一点,我尝试删除 Autofac 包和我的 Inject Attributes 并且错误仍然存​​在。 【参考方案1】:

对于 v2 函数,Function sdk 1.0.14 默认引用 Newtonsoft.Jon v11.0.2,无需显式引用,与 Microsoft.Azure.WebJobs 相同。问题在于您的 VS 使用的功能核心工具 (CLI)。

在本地调试时检查这行 CLI 输出。

Starting Host (HostId=xx, InstanceId=xxx, Version=2.0.11651.0, ...)

如果您看到Version=2.0.11651.0 准确,则表示您的VS 正在使用旧版本的CLI。

实际上最新版本的 Azure Functions 和 Web 作业工具(在 VS 菜单上,工具> 扩展和更新)是 15.0.40617.0。此版本使用最新的 CLI(目前主机版本 2.0.11888),其中 v11 Json.Net 已得到很好的支持。更新此扩展程序可能会解决您的问题。

Visual Studio for Mac 似乎仍在使用旧的 CLI(主机版本 2.0.11651),Mac 用户可以下载新的功能核心工具 using Homebrew 并在内容根路径下运行 func start。或switch update channel 将他们的 VS 更新到最新/预览版。

【讨论】:

非常感谢您抽出宝贵的时间!现在完美运行! 我在最新的 Azure Functions 和 Web 作业工具扩展(如您提到的 15.0.40617.0)中看到了这个问题(以及 2.0.11651.0 版本)。知道为什么它停留在旧版本吗? @MasonWheeler 如果还是看到2.0.11651.0,去看看这个文件夹%LocalAPPDATA%\AzureFunctionsTools\Releases\2.3.3是否存在,里面包含cli、templates和manifest.json。如果下载失败,只需删除%LocalAPPDATA%\AzureFunctionsTools文件夹并重新启动VS重新下载。如果还是不行,请查看this post的更新部分手动下载,注意现在主机版本是2.0.11946.0,文件夹是2.3.3【参考方案2】:

对于 V1 函数,以下链接有助于解决绑定重定向问题

Binding Redirect fix for V1 Azure function

【讨论】:

以上是关于Azure Functions Newtonsoft.Json 加载错误的主要内容,如果未能解决你的问题,请参考以下文章

AZURE_FUNCTIONS_ENVIRONMENT 与 ASPNETCORE_ENVIRONMENT

Azure Functions 与 Azure 流分析

使用“apollo-server-azure-functions”的 Apollo 订阅

在 Java 中使用 Visual Studio Code 的 Azure Functions 项目

Azure Functions 未在本地创建 Azure 表列

Azure Functions - 根据事件类型阻止处理 Azure 服务总线消息