web-dev-qa-db-ja.com

Azure関数のAzure Cosmos DB入力バインディングが機能しない

Azure関数のCosmosDbで入力バインディングを追加する方法について Microsoft learning のウォークスルーに従っていましたが、関数を呼び出すと、内部サーバーエラー(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、Version = 2.9.2.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35'へのバインディングを試行しましたが、ユーザータイプアセンブリは 'System.Stringでした、System.Private.CoreLib、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = 7cec85d7bea7798e。

私が間違っていることはありますか?

7
csg

私はまだ答えの代わりにコメントを残す十分な評判がありませんが、私はこれと同じ問題があり、simandibalazsからの答えは1つのTweakでうまくいきました。新しいUIでも"id":""のフィールドが設定に追加されているようです。IDが指定されていない場合、同じエラーが発生します。私の場合、sqlqueryのみを使用してアイテムのセットを取得したかったため、"id":""行を削除する必要がありました。すべてのアイテムを取得する場合は、ファイルから次の両方の行を削除する必要があります。

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

これはcosmos dbのアイテムです:

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

(ちなみに、patitionkeyの値を設定する必要があります。私の側では、testbowmanです。)

次に、http://localhost:7071/api/todoitems/ /bowmanid2にリクエストを送信します

私は得ることができます:

enter image description here

1
Bowman Zhu

コメントするには評判が足りませんが、UIで問題が発生していました。コードとテストページのように、バインディングブレードの両方。そこで、関数アプリ自体のアプリサービスエディターに移動して、これらのファイルを変更しました。

1

現時点では、これを古いUIに戻すことはできません(または少なくともこのオプションはありません)。ただし、これはfunction.jsonファイル

enter image description here

あなただけを削除する必要があります

"sqlQuery": ""
0
Krzysztof Madej