Azure Functions Newtonsoft.Json加载错误

时间:2018-07-12 11:16:59

标签: c# azure json.net azure-functions

这让我发疯。我在使用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。

该文件存在于我的出纸槽文件夹中。我已经清洗了溶液。更新到最新的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:执行函数时发生异常:   ExecuteWorkItem。 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中。

任何帮助将不胜感激。

预先感谢

2 个答案:

答案 0 :(得分:5)

对于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 and Web Jobs Tools(在VS菜单上,Tools> Extensions and Updates)上的最新版本是15.0.40617.0。此版本使用最新的CLI(当前主机版本为2.0.11888),其中v11 Json.Net已得到很好的支持。更新此扩展程序可能会解决您的问题。

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

答案 1 :(得分:0)

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

Binding Redirect fix for V1 Azure function