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 对 Webhook 的初始响应