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);
}
}
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当前使用的版本来解决此问题:
当Azure函数CLI具有自己的库版本(在node_modules / azure-functions-cli / bin中找到)时,它似乎会忽略MyFunctionApp / bin中的库。在这个小例子中,匹配依赖关系很好但是当MyFunctionApp
具有更大的依赖关系时它是不可行的。
我对这种行为的理解是否正确?
有没有办法指定在预编译函数中使用这些库的哪个版本?我相信通过将依赖项放在函数的bin文件夹中,可以在脚本函数中获得这种行为。
我对此行为原因的假设似乎不正确。
Newtonsoft.Json和Microsoft.Azure.Documents.Client程序集的较新版本实际上是与Azure Function CLI自动加载的程序集一起加载的。
这让我更加困惑,因为直接从控制台应用程序调用时,SimpleHttpTrigger.Run
的行为仍然与Azure函数主机调用时的行为不同。
任何想法是怎么回事?可能是我的愚蠢。
看起来使用Newtonsoft.Json
的两个不同版本,无论哪种方式加载程序集:
MyLibrary
按预期使用Newtonsoft.Json
10.0.2,但其依赖项Microsoft.Azure.Documents.Client
1.13.1使用Newtonsoft.Json
9.0.1
这可能解释了JsonProperty
属性的不兼容性。
可能?请帮忙,我很困惑!
答案 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