【发布时间】:2017-04-19 15:35:04
【问题描述】:
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.Json10.0.2 -
Microsoft.Azure.Documents.Client1.13.1
而MyFunctionApp 依赖于MyLibrary。
在此示例中观察到的问题是,当 Azure Function CLI 调用 SimpleHttpTrigger.Run 时,JsonProperty 属性被忽略。当直接从控制台应用程序调用时,SimpleHttpTrigger 的行为符合预期。
可以通过更改 MyLibrary 的依赖项以匹配 Azure Functions CLI 当前使用的版本来解决此问题:
- Newtonsoft.Json 9.0.1
- Microsoft.Azure.Documents.Client 1.11.4
当 Azure Function 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 属性的不兼容性。
可能吗?请帮忙,我很困惑!
【问题讨论】:
标签: azure azure-webjobs azure-cosmosdb azure-functions