首页 > 解决方案 > Azure 函数错误:Microsoft.Azure.WebJobs.Host:错误索引方法“Function1”。无法将参数“文档”绑定到类型 IAsyncCollector`

问题描述

我是 Azure Function 的新手,在我的第一个函数中我使用的是 CosmosDB。在引擎盖下,函数完美地完成了它的工作,但是当我在门户中打开我的函数时,我收到了这个错误。

函数 (LOANGILITY-AZFUNCTION/ProductDetailsFunc) 错误:Microsoft.Azure.WebJobs.Host:错误索引方法“ProductDetailsFunc”。Microsoft.Azure.WebJobs.Host:无法将参数“文档”绑定到类型 IAsyncCollector`1。确保绑定支持参数类型。如果您正在使用绑定扩展(例如 Azure 存储、ServiceBus、计时器等),请确保您已在启动代码中调用了扩展的注册方法(例如 builder.AddAzureStorage()、builder.AddServiceBus( )、builder.AddTimers() 等)。

我的函数头原型是

public static async Task<HttpResponseMessage> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req,
        [DocumentDB(
            databaseName: "OB",
            collectionName: "ProductDetails",
            ConnectionStringSetting = "DBConnection")]IAsyncCollector<dynamic> document,
        TraceWriter log)

从我的代码生成的 json 是

{
  "generatedBy": "Microsoft.NET.Sdk.Functions-1.0.13",
  "configurationSource": "attributes",
  "bindings": [
    {
      "type": "httpTrigger",
      "methods": [
        "get",
        "post"
      ],
      "authLevel": "anonymous",
      "name": "req"
    }
  ],
  "disabled": false,
  "scriptFile": "../bin/Loangility01.dll",
  "entryPoint": "Loangility01.ProductDetailsFunc.Run"
}

我还看到了其他一些 SO 问题,他们builder.something在代码中讨论,我没有使用 .Net Core Azure Function,我的目标项目框架是4.6.1.

标签: c#azureazure-functionsazure-cosmosdb

解决方案


根据我的测试,我们可以通过visual studio直接将Function部署到Azure。但是我们需要在 local.settings.json 中手动配置一些设置,例如 Cosmos Db 连接字符串。详细步骤如下

  1. 开发我的代码:
 public static class Function2
    {
        [FunctionName("Function2")]
        public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, [DocumentDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection")]IAsyncCollector<dynamic> toDoItemsOut, TraceWriter log)
        {
            log.Info("C# HTTP trigger function processed a request.");

            // parse query parameter
            string name = req.GetQueryNameValuePairs()
                .FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
                .Value;

            if (name == null)
            {
                // Get request body
                dynamic data = await req.Content.ReadAsAsync<object>();
                name = data?.name;
            }
            HttpResponseMessage response ;



            if (name == null) {
                response = req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body");

            }
            else {

                response= req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
            }
            await toDoItemsOut.AddAsync(response.Content);
            return response;
        }
    }
  1. 部署到 Azure 在此处输入图像描述

  2. 配置应用程序设置

在此处输入图像描述

在此处输入图像描述

  1. 测试 在此处输入图像描述

在此处输入图像描述

更新 关于这个问题,可能是您没有将 cosmos db 连接字符串添加到应用程序设置中。请检查您是否已添加。 在此处输入图像描述

此外,如果您添加了它,您仍然有错误。您检查日志以获取详细的错误消息。 在此处输入图像描述


推荐阅读