我正在尝试使用WebJobs SDK扩展(以及VS的Azure Functions工具)将我的Azure功能迁移到预编译的二进制文件,但我遇到了DocumentDB绑定的问题。
我正在尝试创建一个输入绑定到我可以读取的现有DocumentDB文档,然后更新数据。当我在基于脚本的Azure函数中执行此操作时,一切都按我想要的方式工作。这是我正在使用的代码:
public static void Run(TimerInfo myTimer, JObject document, TraceWriter log)
{
log.Info(document.ToString());
var active = document["active"] as JArray;
foreach (var item in active)
{
log.Info($"Polling {item}...");
}
document["processed"] = DateTime.Now;
log.Info(document.ToString());
}
有问题的文件如下:
{
"id": "sites",
"_rid": "(hash)",
"_self": "(stuff)",
"_etag": "\"(guid)\"",
"_attachments": "attachments/",
"active": [
"scifi"
],
"_ts": 1497184149
}
如果我尝试使用WebJobs属性将此确切代码移动到预编译函数中:
[FunctionName("TimerFeed")]
public static void Run(
[TimerTrigger("0 */5 * * * *")]TimerInfo myTimer,
[DocumentDB("FeedStateDatabase", "FeedItemsCollection", ConnectionStringSetting = "feed_DOCUMENTDB", Id = "sites")] JObject document,
TraceWriter log)
然后我在尝试运行该函数时遇到错误:
2017-06-11T12:26:36.046 Exception while executing function: Functions.TimerFeed. Newtonsoft.Json: Cannot create and populate list type Newtonsoft.Json.Linq.JToken. Path 'active', line 1, position 219.
请注意,在我的任何函数代码运行之前,会抛出错误。即使我删除所有代码并只做一个简单的诊断日志,它也会被抛出。所以,我很确定我的绑定有问题。正在生成的functions.json
文件会显示,特别是它声称这是一个输出绑定:
{
"type": "documentDB",
"databaseName": "FeedStateDatabase",
"collectionName": "FeedItemsCollection",
"createIfNotExists": false,
"connection": "feed_DOCUMENTDB",
"id": "sites",
"direction": "out",
"name": "document"
}
答案 0 :(得分:3)
我正在使用安装了Visual Studio 2017 v15.3 Preview的Azure Function Tools extension。发布到Azure功能后, 您提到的代码可以在方向从输出更改为 后添加新的documentdb连接字符串后正常工作。以下是我的详细步骤:
1.安装Visual Studio 2017 v15.3预览和Azure功能工具扩展
2.创建Azure Function项目并添加timetrigger函数添加引用 Microsoft.Azure.WebJobs.Extensions.DocumentDB
3.将存储连接字符串添加到local.setting.json文件中的AzureWebStorage和AzureWebJobsDashboard
4.从Azure WebJob Extension SDK我们知道documentdb默认连接字符串名称是 AzureWebJobsDocumentDBConnectionString 。为其添加相应的值。
5.在timetrigger函数中添加以下代码
[FunctionName("TimerTriggerCSharp")]
public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, [DocumentDB("database name", "collection name", ConnectionStringSetting = "AzureWebJobsDocumentDBConnectionString", Id = "document Id")] JObject document, TraceWriter log)
{
log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
log.Info($"My property: {documents["MyProperty"]}");
}
我的测试文件是:
{
"MyProperty": "hello1",
"id": "a3e6a493-7c2c-4a73-8715-e7efad107d96",
"_rid": "IgcwAN0Etg8BAAAAAAAAAA==",
"_self": "dbs/IgcwAA==/colls/IgcwAN0Etg8=/docs/IgcwAN0Etg8BAAAAAAAAAA==/",
"_etag": "\"0600e070-0000-0000-0000-590152cc0000\"",
"_attachments": "attachments/",
"_ts": 1493258955
}
6.我在本地调试它,我发现文档总是为空。我认为它可能是SDK问题。
7.解决问题并将项目发布到Azure,我还重现了Naren提到的问题。
Visual Studio 2017工具始终为DocumentDb
生成方向
8.然后我手动更改了“direction”:“in”。
9.保存更改并切换到集成标签并创建相应的 documentdb connectionstring。
10.从天蓝色门户运行该功能,它可以正常工作
答案 1 :(得分:1)
这看起来像一个已知问题。 Visual Studio 2017工具始终为DocumentDb生成方向。对于像blob这样的存储绑定。 FileAccess用于标识它是输入绑定还是输出绑定。
https://github.com/Azure/azure-functions-vs-build-sdk/issues/41