Azure functions Azure函数的Azure Cosmos DB输入绑定不';行不通
我正在跟随的是一个关于如何为azure函数添加CosmosDb的输入绑定的演练,但是在调用该函数时,它会不断返回内部服务器错误(500 http代码) function.json中azure函数的配置为:Azure functions Azure函数的Azure Cosmos DB输入绑定不';行不通,azure-functions,azure-cosmosdb,Azure Functions,Azure Cosmosdb,我正在跟随的是一个关于如何为azure函数添加CosmosDb的输入绑定的演练,但是在调用该函数时,它会不断返回内部服务器错误(500 http代码) function.json中azure函数的配置为: { "bindings": [ { "authLevel": "function", "type": "httpTrigger", "direction": "in", "name": "Request", "method
{
"bindings": [
{
"authLevel": "function",
"type": "httpTrigger",
"direction": "in",
"name": "Request",
"methods": [
"get",
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "Response"
},
{
"name": "bookmark",
"direction": "in",
"type": "cosmosDB",
"databaseName": "func-io-learn-db",
"collectionName": "Bookmarks",
"connectionStringSetting": "learn_DOCUMENTDB",
"id": "{id}",
"partitionKey": "{id}",
"sqlQuery": ""
}
]
}
应用程序服务中有一个learn_DOCUMENTDB配置设置,它具有到cosmos db实例的有效连接字符串(已自动创建)
错误日志条目显示:
无法将CosmosDB绑定到类型“System.String”。可能原因:1)尝试绑定到“Microsoft.Azure.Documents.Client.DocumentClient,Microsoft.Azure.DocumentDB.Core,版本=2.9.2.0,区域性=中性,PublicKeyToken=31bf3856ad364e35”,但用户类型程序集为“System.String,System.Private.CoreLib,版本=4.0.0.0,区域性=中性,PublicKeyToken=7CEC85D7BE7798E”
我做错什么了吗?Class1.cs:
using System;
using System.Collections.Generic;
using System.Text;
namespace FunctionApp52
{
public class Class1
{
public string Id { get; set; }
}
}
功能1.cs:
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace FunctionApp52
{
public static class Function1
{
[FunctionName("DocByIdFromRouteData")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",
Route = "todoitems/{partitionKey}/{id}")]HttpRequest req,
[CosmosDB(
databaseName: "testbowman",
collectionName: "testbowman",
ConnectionStringSetting = "CosmosDBConnection",
Id = "{id}",
PartitionKey = "{partitionKey}")] Class1 item,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
log.LogInformation( "Id is: "+item.Id);
if (item == null)
{
log.LogInformation($"ToDo item not found");
}
else
{
log.LogInformation($"Found ToDo item");
}
return new OkObjectResult("!!!!!!!!!!!!!!!!!!");
}
}
}
这是cosmos db中的项目:
{
"id": "bowmanid2",
"PartitionKey": "bowmankey",
"Description": "bowmandes",
"testbowman": " "
}
(顺便说一下,您需要设置pationkey的值。在我这方面,它是testbowman。)
然后我向http://localhost:7071/api/todoitems/ /bowmanid2
我可以得到:
我也遇到了同样的问题,新UI生成的绑定与旧UI不同 新用户界面:
{
"name": "bookmark",
"direction": "in",
"type": "cosmosDB",
"databaseName": "func-io-learn-db",
"collectionName": "Bookmarks",
"connectionStringSetting": "learn-0088a129-899f-4d18-b4db-5fa74daf1cc3_DOCUMENTDB",
"id": "{id}",
"partitionKey": "{id}",
"sqlQuery": ""
}
旧用户界面:
{
"type": "cosmosDB",
"name": "bookmark",
"databaseName": "func-io-learn-db",
"collectionName": "Bookmarks",
"connectionStringSetting": "learn-0088a129-899f-4d18-b4db-5fa74daf1cc3_DOCUMENTDB",
"id": "{id}",
"partitionKey": "{id}",
"direction": "in"
}
移除
"sqlQuery": ""
装订的部分给我修好了
您可以通过单击应用程序服务概述页面上的“有问题?单击返回经典功能应用程序管理体验”切换回旧用户界面,如您所见。我没有足够的声誉来留下评论而不是答案,但我也遇到了同样的问题,西曼迪巴拉兹的答案对我来说只需稍加调整。新的UI似乎还为配置添加了一个
“id”:“
”字段,如果您没有在配置中指定id,则会发生相同的错误。在我的例子中,我希望仅使用sqlquery检索一组项,为此,我仍然必须删除“id”:“
行。如果要检索所有项目,必须从文件中删除以下两行
"sqlQuery": ""
"id": ""
声誉不足,无法发表评论,但: 我在UI上遇到了一些问题。两者都在绑定刀片服务器中,就像在“代码+测试”页面中一样。
因此,我转到函数应用程序本身上的应用程序服务编辑器来更改这些文件。目前无法切换回旧UI(或者至少我没有此选项),但这可以通过编辑
function.json
文件直接在门户网站上完成
你只需要删除
"sqlQuery": ""
我在这里描述的练习之后的练习中工作,这里需要一个到CosmosDB的输出绑定。我使用的是Javascript(node.js),即使有上述建议也无法让它工作——直到我将函数Runtime v3切换回v2。
这可以在您的函数->配置->函数运行时设置下找到。对于仍在关注此问题的人,如果上述解决方案无法解决此问题 我也有同样的问题,无法检索数据。按照上面的建议检查function.json。但问题不在于“sqlQuery”参数 根据MicrosoftLearn的教程,在创建输入DB绑定时,我将绑定和分区id值设置为“id”和“/id”。这在function.JSON文件中显示。因此,我的JSON文件如下所示: “id”:“id”, “分区键”:“/id” 查看上述答案后,我将DB的function.JSON绑定更改为:
"id": "{id}",
"partitionKey": "{id}"
只有在进行此更改后,它才开始工作。手动将function.json更新为:
"id": "{id}",
"partitionKey": "{id}",
对我有效,但一旦调用或保存该函数,它就会将更改恢复为:
"id": "id",
"partitionKey": "/id",
然后又停止了工作。我能让它保留更改的唯一方法是编辑集成部分,如下所示:
然后设置工作。您使用的是什么语言?我有post-answer,它工作得很好,但它是基于C#library的。必须设置partitionkey的值吗?在我这方面,partitionkey是testbowman。我对同样的MS学习问题也有同样的问题,我尝试了经典模式,但似乎失败了。我已经为microsoft添加了反馈,以通过指向此stackoverflow页面的链接进行修复,希望他们能够修复。看起来我收到了该问题的快速修复;感谢您的备选解决方案!空的sqlQuery参数似乎就是问题所在。更改文件后,我必须返回到绑定UI。设置为空,在重新输入设置(而不是放弃更改)后,绑定现在开始工作。我体验到在function.json中添加“{id}”会导致大括号无法保存,导致所有请求都出现404。从集成部分添加{id}解决了这个问题。我的问题更复杂,因为我的“id”参数甚至没有生成,我不得不添加它来开始工作,结果发现教程一开始没有提到任何关于添加它的内容!在我的例子中,{}在id周围丢失了。下次我创建输入触发器时,肯定有什么地方出错了,它在没有{}的情况下工作。不确定这里发生了什么。同样,“sqlQuery”:“”不再显示在function.json中,但我仍然得到500个错误代码,而不是400个,当DB找不到记录时,它根本没有到达函数。谢谢你也为我工作。MS docs需要升级。我花了半个小时才找到这个。他们真的需要改进文档。这对我很有效,谢谢。谢谢,这也解决了我的问题。它也没有为我节省。我同时通过编辑器和绑定菜单更新键,但它只适用于单个请求。我必须关闭所有的标签,通过绑定菜单更新键,然后它才能最终工作。