Azure functions Azure函数的Azure Cosmos DB输入绑定不';行不通

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

我正在跟随的是一个关于如何为azure函数添加CosmosDb的输入绑定的演练,但是在调用该函数时,它会不断返回内部服务器错误(500 http代码)

function.json中azure函数的配置为:

{
  "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需要升级。我花了半个小时才找到这个。他们真的需要改进文档。这对我很有效,谢谢。谢谢,这也解决了我的问题。它也没有为我节省。我同时通过编辑器和绑定菜单更新键,但它只适用于单个请求。我必须关闭所有的标签,通过绑定菜单更新键,然后它才能最终工作。