将DocumentDB绑定迁移到Azure WebJobs SDK Extensions时出错

时间:2017-06-11 12:35:21

标签: azure azure-functions azure-webjobssdk

我正在尝试使用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"
}

2 个答案:

答案 0 :(得分:3)

我正在使用安装了Visual Studio 2017 v15.3 PreviewAzure Function Tools extension。发布到Azure功能后, 您提到的代码可以在方向输出更改为 后添加新的documentdb连接字符串后正常工作。以下是我的详细步骤:

1.安装Visual Studio 2017 v15.3预览和Azure功能工具扩展

2.创建Azure Function项目并添加timetrigger函数添加引用 Microsoft.Azure.WebJobs.Extensions.DocumentDB

enter image description here

3.将存储连接字符串添加到local.setting.json文件中的AzureWebStorage和AzureWebJobsDashboard

4.从Azure WebJob Extension SDK我们知道documentdb默认连接字符串名称是 AzureWebJobsDocumentDBConnectionString 。为其添加相应的值。

enter image description here

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问题。

enter image description here

7.解决问题并将项目发布到Azure,我还重现了Naren提到的问题。

  

Visual Studio 2017工具始终为DocumentDb

生成方向

8.然后我手动更改了“direction”:“in”

enter image description here

9.保存更改并切换到集成标签并创建相应的 documentdb connectionstring。

enter image description here

10.从天蓝色门户运行该功能,它可以正常工作

enter image description here

答案 1 :(得分:1)

这看起来像一个已知问题。 Visual Studio 2017工具始终为DocumentDb生成方向。对于像blob这样的存储绑定。 FileAccess用于标识它是输入绑定还是输出绑定。

https://github.com/Azure/azure-functions-vs-build-sdk/issues/41