Azure函数Newtonsoft.Json加载错误

Len*_*y D 5 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>
Run Code Online (Sandbox Code Playgroud)

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

该文件存在于我的输出bin文件夹中.我已经清理了解决方案.已更新至最新的VS和Azure功能以及WebJobs工具15.0.40608.0

功能应用程序启动正常,但是当我向队列添加消息以调用触发器时,我在控制台中收到以下错误.

[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,Version = 11.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed'.无法找到或加载特定文件.(来自HRESULT的异常:0x80131621).System.Private.CoreLib:无法加载文件或程序集'Newtonsoft.Json,Version = 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)
    {}
Run Code Online (Sandbox Code Playgroud)

任何想法现在都会非常感激,唯一似乎有类似问题的人是这里的人: 去他的帖子的底部

他没有回复他的查询,他在Mac环境中,而我在Windows 10上.

任何帮助将非常感激.

提前致谢

Jer*_*Liu 5

对于v2函数,函数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, ...)
Run Code Online (Sandbox Code Playgroud)

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

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

似乎Visual Studio for Mac仍然利用旧的CLI(主机版本2.0.11651),Mac用户可以使用Homebrew下载新的功能核心工具并func start在内容根路径中运行.或者切换更新频道以将其VS更新为最新/预览版本.