web-dev-qa-db-fra.com

La liaison d'entrée Azure Cosmos DB pour une fonction Azure ne fonctionne pas

Je suivais une procédure pas à pas de Microsoft learning sur la façon d'ajouter une liaison d'entrée avec CosmosDb pour une fonction Azure, mais lors de l'appel de la fonction, elle continue de renvoyer une erreur de serveur interne (500 code http).

La configuration de la fonction Azure de function.json est:

{
  "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": ""
    }
  ]
}

Il existe des paramètres de configuration learn_DOCUMENTDB dans le service d'application qui a une chaîne de connexion valide à l'instance de cosmos db (a été créée automatiquement).

L'entrée du journal des erreurs indique que:

Impossible de lier CosmosDB au type "System.String". Causes possibles: 1) Tentative de liaison à "Microsoft.Azure.Documents.Client.DocumentClient, Microsoft.Azure.DocumentDB.Core, Version = 2.9.2.0, Culture = neutre, PublicKeyToken = 31bf3856ad364e35" mais l'assembly de type d'utilisateur était "System.String , System.Private.CoreLib, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = 7cec85d7bea7798e.

Y a-t-il quelque chose que je fais de mal?

7
csg

Je n'ai pas encore assez de réputation pour laisser un commentaire au lieu d'une réponse, mais j'ai eu ce même problème et la réponse de simandibalazs a fonctionné pour moi avec un Tweak. Il semble que la nouvelle interface utilisateur ajoute également un champ pour "id":"" à la configuration et si vous n'avez pas d'id spécifié ici, la même erreur se produira. Dans mon cas, je voulais récupérer un ensemble d'éléments en utilisant UNIQUEMENT la requête sql, et pour ce faire, je devais toujours supprimer le "id":"" ligne. Si vous souhaitez récupérer tous les éléments, vous devez supprimer les deux lignes suivantes du fichier.

"sqlQuery": ""
"id": ""
1
Jason

Class1.cs:

using System;
using System.Collections.Generic;
using System.Text;

namespace FunctionApp52
{
    public class Class1
    {
        public string Id { get; set; }
    }
}

Function1.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("!!!!!!!!!!!!!!!!!!");
        }
    }
}

Voici l'élément dans cosmos db:

{
    "id": "bowmanid2",
    "PartitionKey": "bowmankey",
    "Description": "bowmandes",
    "testbowman": " "
}

(Au fait, vous devez définir la valeur de patitionkey. De mon côté, c'est testbowman.)

Et puis j'envoie une demande à http://localhost:7071/api/todoitems/ /bowmanid2

Je peux obtenir:

enter image description here

1
Bowman Zhu

Pas assez de réputation pour commenter MAIS: je rencontrais des problèmes avec l'interface utilisateur. Tant dans la lame de liaisons que dans la page code + test. Je suis donc allé à l'éditeur de service d'application sur l'application de fonction elle-même pour modifier ces fichiers.

1
Frederic de smet

Pour le moment, il n'est pas possible de revenir à l'ancienne interface utilisateur (ou du moins je n'ai pas cette option) mais cela peut être fait directement sur le portail en éditant function.json fichier

enter image description here

Il vous suffit de supprimer

"sqlQuery": ""
0
Krzysztof Madej