预编译的Azure函数意外地执行

时间:2017-04-19 15:35:05

标签: azure azure-webjobs azure-cosmosdb azure-functions

MyLibrary.dll

public class Person
{
    [JsonProperty("name")]
    public string Name { get; set; }

    public static async Task Save(Person person)
    {
        DocumentClient client = CreateDocumentClient();
        await client.OpenAsync();

        await client.CreateDocumentAsync(CreateDocumentCollectionUri(), person);
    }
}

MyFunctionApp.dll

public class SimpleHttpTrigger
{
    public static async Task Run(HttpRequestMessage req)
    {
        Person bob = new Person() { Name = "Bob" };
        await Person.Save(bob);
    }
}

MyLibrary取决于:

  • Newtonsoft.Json 10.0.2
  • Microsoft.Azure.Documents.Client 1.13.1

MyFunctionApp取决于MyLibrary

此示例中观察到的问题是,当Azure Function CLI调用JsonProperty时,将忽略SimpleHttpTrigger.Run属性。直接从控制台应用程序调用时,SimpleHttpTrigger的行为符合预期。

可以通过更改MyLibrary的依赖项来匹配Azure Functions CLI当前使用的版本来解决此问题:

  • Newtonsoft.Json 9.0.1
  • Microsoft.Azure.Documents.Client 1.11.4

当Azure函数CLI具有自己的库版本(在node_modules / azure-functions-cli / bin中找到)时,它似乎会忽略MyFunctionApp / bin中的库。在这个小例子中,匹配依赖关系很好但是当MyFunctionApp具有更大的依赖关系时它是不可行的。

我对这种行为的理解是否正确?

有没有办法指定在预编译函数中使用这些库的哪个版本?我相信通过将依赖项放在函数的bin文件夹中,可以在脚本函数中获得这种行为。

更新

我对此行为原因的假设似乎不正确。

Newtonsoft.Json和Microsoft.Azure.Documents.Client程序集的较新版本实际上是与Azure Function CLI自动加载的程序集一起加载的。

这让我更加困惑,因为直接从控制台应用程序调用时,SimpleHttpTrigger.Run的行为仍然与Azure函数主机调用时的行为不同。

任何想法是怎么回事?可能是我的愚蠢。

更新2

看起来使用Newtonsoft.Json的两个不同版本,无论哪种方式加载程序集:

MyLibrary按预期使用Newtonsoft.Json 10.0.2,但其依赖项Microsoft.Azure.Documents.Client 1.13.1使用Newtonsoft.Json 9.0.1

这可能解释了JsonProperty属性的不兼容性。

可能?请帮忙,我很困惑!

1 个答案:

答案 0 :(得分:1)

基本上,您对问题的诊断是正确的。 这是Azure Functions的一个未解决的问题。 我自己偶然发现了这一点并同情你的挫败感。

在问题解决之前,您必须使用与Azure功能实现共享的所有依赖项的相同主要版本。

以下是Azure Functions依赖项列表:https://github.com/Azure/azure-webjobs-sdk-script/blob/dev/src/WebJobs.Script/packages.config

打开要跟踪的问题: https://github.com/Azure/azure-webjobs-sdk-script/issues/573 https://github.com/Azure/azure-webjobs-sdk-script/issues/1311