Azure应用功能(功能2.x):通过HTTP功能在CosmosDB中创建新文档

时间:2019-06-18 22:52:10

标签: c# azure azure-functions azure-cosmosdb

我正在尝试实现一个Azure HTTP函数,该函数获取一些JSON数据并在CosmoDB数据库中创建一个新对象。

我在Stackoverflow上阅读了以下问题:

  1. Azure function C#: Create or replace document in cosmos db on HTTP request
  2. Azure function inserting but not updating cosmosDB

但是他们使用的是Function 1.x版本,因此我在Microsoft方面搜索了一些准则,并发现了以下内容:

  1. Output - examples

基于本文,我在Visual Studio社区中编写了C#类,并希望将其发布在我的Azure App Function资源上:

using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Extensions.CosmosDB;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using BackendFunctions.Utils;

namespace BackendFunctions.Http.Business
{
    public static class A_Dummy_Function
    {
        [FunctionName("A_Dummy_Function")]
        public static IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest request,
            [CosmosDB(
                databaseName: "DB-NAME-VALUE",
                collectionName: "A-COLLECTION",
                ConnectionStringSetting = BackendConfiguration.DB_CONNECTION_STRING)] out dynamic document,
            ILogger log)
        {

            document = new { Description = "BLA BLA", id = Guid.NewGuid() };

            ActionResult toReturn = (ActionResult) new OkObjectResult($"Hello world, this creates a new object!");

            return toReturn;
        }
    }
}

您可以看到CosmosDB连接(绑定)由Function 2.x版本管理(实际上我安装了 Microsoft.Azure.WebJobs.Extensions.CosmosDB NuGet程序包),并且有以下参数在功能中:

[CosmosDB(
     databaseName: "DB-NAME-VALUE",
     collectionName: "A-COLLECTION",
     ConnectionStringSetting = BackendConfiguration.DB_CONNECTION_STRING)] out dynamic document

当我尝试在Azure App Function资源上发布功能时,出现错误。

似乎无法将我的C#类转换为 function.json

您对我为什么不能远程发布此类功能有何建议?

1 个答案:

答案 0 :(得分:3)

我宁愿使用IAsyncCollector而不是out。请参见here中的示例。

    [FunctionName("WriteDocsIAsyncCollector")]
    public static async Task Run(
        [QueueTrigger("todoqueueforwritemulti")] ToDoItem[] toDoItemsIn,
        [CosmosDB(
            databaseName: "ToDoItems",
            collectionName: "Items",
            ConnectionStringSetting = "CosmosDBConnection")]
            IAsyncCollector<ToDoItem> toDoItemsOut,
        ILogger log)
    {
        log.LogInformation($"C# Queue trigger function processed {toDoItemsIn?.Length} items");

        foreach (ToDoItem toDoItem in toDoItemsIn)
        {
            log.LogInformation($"Description={toDoItem.Description}");
            await toDoItemsOut.AddAsync(toDoItem);
        }
    }

只需与您的HttpTrigger交换QueueTrigger。