尝试在Azure函数中使用绑定名称作为参数时出现System.InvalidOperationException

时间:2019-01-02 05:49:47

标签: azure azure-functions csx

遵循本教程chain-azure-functions-data-using-bindings, 当使用JavaScript时,它可以工作,但是在发送带有查询参数的GET请求时,使用.net作为运行时堆栈创建了一个新的功能应用,并添加了所需的cosmos db映射。 https://azurefuncurl?code=abc&id=docs appinsights揭示了由于System.InvalidOperationException而导致Azure功能/主机无法启动

尝试通过官方文档:azure-functions/configInput-Usage,不走运

function.json

{
 "bindings": [
{
  "authLevel": "function",
  "name": "req",
  "type": "httpTrigger",
  "direction": "in",
  "methods": [
    "get",
    "post"
  ]
},
{
  "name": "$return",
  "type": "http",
  "direction": "out"
},
{
  "type": "cosmosDB",
  "name": "bookmark",
  "databaseName": "func-io-learn-db",
  "collectionName": "Bookmarks",
  "connectionStringSetting": "chainazurefunctions_DOCUMENTDB",
  "id": "{id}",
  "partitionKey": "{id}",
  "direction": "in"
 }]
}

run.csx

#r "Newtonsoft.Json"
using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log, dynamic bookmark)
{

log.LogInformation("C# HTTP trigger function processed a request.");

string name = req.Query["id"];

string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;

return name != null
    ? (ActionResult)new OkObjectResult($"Hello, {name}")
    : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

异常消息:

Error indexing method 'Functions.find-bookmark' Unable to resolve binding parameter 'id'. Binding expressions must map to either a value provided by the trigger or a property of the value the trigger is bound to, or must be a system binding expression (e.g. sys.randguid, sys.utcnow, etc.).

2 个答案:

答案 0 :(得分:1)

只需将{id}替换为{Query.id},看看csx sample

答案 1 :(得分:1)

供以后参考 基于Jerry Liu's recommendation , 我必须在function.json中将id替换为{Query.id},例如键id和partitionKey中的注释值

{
  "type": "cosmosDB",
  "name": "bookmark",
  "databaseName": "func-io-learn-db",
  "collectionName": "Bookmarks",
  "connectionStringSetting": "chainazurefunctions_DOCUMENTDB",
  "id": "{Query.id}",
  "partitionKey": "{Query.id}",
  "direction": "in"
}

在run.csx

创建一个POCO模型类并将其用作Run方法中的参数,以下是整个run.csx的样子

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System.Text;

public class Bookmark
{
    [JsonIgnore]
    public string id {get; set;}

    [JsonProperty(PropertyName ="url")]
    public string URL {get;set;}

}

public static HttpResponseMessage  Run(HttpRequest  req, ILogger log, Bookmark bookmark)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    if(bookmark == null)
    {        
        string id = req.Query["id"];
        log.LogInformation($"Bookmark item {id} not found");

        return new HttpResponseMessage(HttpStatusCode.NotFound)
        {
            Content = new StringContent($"{id} not found", Encoding.UTF8, "application/json")
        };
    }
    else
    {
        log.LogInformation($"Found item {bookmark.URL}");
        return new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StringContent(JsonConvert.SerializeObject(bookmark), Encoding.UTF8, "application/json")
        };
    }
}