Newtonsoft 11.0.0.0 无法在 Azure Function App 2.0 上加载

Posted

技术标签:

【中文标题】Newtonsoft 11.0.0.0 无法在 Azure Function App 2.0 上加载【英文标题】:Newtonsoft 11.0.0.0 unable to load on Azure Function App 2.0 【发布时间】:2019-02-12 18:21:30 【问题描述】:

我使用 Azure Http 触发器创建了一个开箱即用的 Azure Function App。这给了我下面的代码。我所更新的只是将 HttpRequest 正文转换为我的 Helper 类。

这里是代码

public static class TriggerTest

    [FunctionName("TriggerTest")]
    public static IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, TraceWriter log)
    

        log.Info("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = new StreamReader(req.Body).ReadToEnd();

        Helper data = JsonConvert.DeserializeObject<Helper>(requestBody);

        name = name ?? data?.value;

        return name != null
            ? (ActionResult)new OkObjectResult($"Hello, name")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    


public class Helper

    public string value  get; set; 

当我尝试运行它时,它编译得很好,但是控制台被下面的垃圾邮件发送了

发生了 ScriptHost 错误

System.Private.CoreLib:执行函数时出现异常: 触发测试。 TestingAzure.FunctionApp:无法加载文件或程序集 ‘Newtonsoft.Json,版本=11.0.0.0,文化=中性, PublicKeyToken=30ad4fe6b2a6aeed’。无法找到或加载特定的 文件(来自 HRESULT 的异常:0x80131621)。 System.Private.CoreLib: 无法加载文件或程序集'Newtonsoft.Json,版本 = 11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'

所有 Nuget 包都引用了 Microsoft.NET.Sdk.Functions 所引用的 Newtonsoft 11.0.2。该项目是一个 .NET Standard 2.0 项目。我引用的 Nuget 包是

Microsoft.ApplicationInsights v2.7.2 Microsoft.Azure.WebJobs.Extensions v3.0.0.-beta8 Microsoft.Azure.WebJobs.Extensions.Http v3.0.0-beta8 Microsoft.Azure.WebJobs.ServiceBus v3.0.0.-beta5 Microsoft-NET-Sdk-Functions v1.0.19 NETStandard,Library v2.0.3 Newtonsoft.Json v11.0.2

我在本地运行它,尚未在 Azure 中对其进行测试,但是我需要它在本地运行以进行测试。

另外,从 Visual Studio 2017 下载的 CLI 是 2.0.1-beta.25

适用于 Visual Studio 的 Azure Functions 和 Web 作业工具版本为 15.10.2009.0

【问题讨论】:

Azure Function 运行时依赖于多个库,Newtonsoft 就是其中之一。您应该考虑降级版本。 例如,这里是 Azure Functions 1.0 使用的库列表:gist.github.com/fabiocav/8fcccd4d54ec298e3b120cbc1230c02a @Kzrystof 这是一个 v2 函数,它使用 SDK 的更新版本 @juunas 是的。 v1示例是为了表明我们需要使用某些NuGet包的特定版本来匹配Function的宿主。 v2 没有类似的页面(我猜是因为它仍在预览中),即使我要求提供一个。您可以在 SO 上看到类似的问题,因为相同的原因没有加载 WindowsAzure.Storage。 【参考方案1】:

对于 v2 函数,Function sdk 1.0.19(>=1.0.14) 默认引用 Newtonsoft.Jon v11.0.2。该错误来自您的 VS 使用的 CLI。 2.0.1-beta.25 太旧了,VS 最新的是2.0.1-beta.38。

解决方案是确保下载成功。此外,Microsoft.Azure.WebJobs.ServiceBus 应该是3.0.0-beta8

    删除旧的 CLI 文件夹 %localappdata%\AzureFunctionsTools

    重启 VS 并创建一个新的 Azure 函数。在创建对话框中等待 VS 下载新的 CLI 和模板,直到我们看到提示更改为 Updates are ready。

    如果您在一段时间后没有看到更新已准备就绪(您需要下载 200M 文件),请再次检查 %localappdata%\AzureFunctionsTools。如果只有文件夹 2.0.1-beta.25 有内容,请尝试重复上述步骤或求助update part of this answer手动下载,需要访问%localappdata%\AzureFunctionsTools\feed.json找到最新版本的下载url(feed version=2.5.2现在)。

【讨论】:

以上是关于Newtonsoft 11.0.0.0 无法在 Azure Function App 2.0 上加载的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法加载文件或程序集“Microsoft.SqlServer.Management.Sdk.Sfc,Version = 11.0.0.0”

“无法访问 Newtonsoft.Json.Linq.JValue 上的子值”

最短路问题------分别用深搜和广搜去解题

无法将类型“newtonsoft.json.linq.jtoken”隐式转换为 newt“newtonsoft.json.linq.jvalue”

无法访问 Newtonsoft.JSON .Net Core 2.* 方法

从 JSON 检索项目时获取“无法将 Newtonsoft.Json.Linq.JObject 转换为 Newtonsoft.Json.Linq.JToken”