Azure App Function (Functions 2.x):通过 HTTP 函数在 CosmosDB 中创建新文档

Posted

技术标签:

【中文标题】Azure App Function (Functions 2.x):通过 HTTP 函数在 CosmosDB 中创建新文档【英文标题】:Azure App Function (Functions 2.x): Create new document in CosmosDB via HTTP function 【发布时间】:2019-11-01 14:59:00 【问题描述】:

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

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

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

但他们使用的是 Function 1.x 版本,因此我在微软方面搜索了一些指南,发现如下:

    Output - examples

根据这篇文章,我在 Visual Studio Community 中编写了我的 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

你对我为什么不能远程发布这样的功能有什么建议吗?

【问题讨论】:

错误信息是什么 我认为函数绑定属性不支持BackendConfiguration.DB_CONNECTION_STRING,您是否尝试过使用字符串并查看它是否有效? @MatiasQuaranta 你是对的,我的解决方案存在一些问题。我从班级中删除了连接字符串并将其放入 App Function 的配置中。谢谢你的提示! 【参考方案1】:

我宁愿使用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);
        
    

只需将 QueueTrigger 与您的 HttpTrigger 交换即可。

【讨论】:

我知道我不应该提出更多问题,但是我有办法在插入完成后返回 OkObjectResult 吗? 不,当您使用绑定时,实际写入数据库的操作会从您身上抽象出来。当您需要对此进行控制(或响应)时,您需要使用 DocumentClient:docs.microsoft.com/en-us/azure/azure-functions/…

以上是关于Azure App Function (Functions 2.x):通过 HTTP 函数在 CosmosDB 中创建新文档的主要内容,如果未能解决你的问题,请参考以下文章

从 Azure Function App 访问带有防火墙的 Azure Blob 存储

Azure Blob Storage V2,来自 Azure Function App 的异常 API 调用,升级后

Azure Function App 不由事件中心触发

Azure Function App 对 Webhook 的初始响应

如何确定 Webhook 未触发 Azure Function App 的原因

Azure Function App:身份验证中断开发门户