Azure Functions - table 存储绑定不起作用

Azure Functions - table storage binding not working

我有一个似乎是在 azure 函数中绑定 table 存储的常见问题。我读过很多关于堆栈溢出的答案,如果不是全部的话,比如

以及我在 github 和 ms 文档中可以找到的尽可能多的内容。尽管尝试了所有修复,none 还是奏效了。

这更加令人困惑,因为我让它工作了..几天后当我回到项目时,我开始收到这个错误 -

Microsoft.Azure.WebJobs.Host: Error indexing method 'GetCompetitions'. >Microsoft.Azure.WebJobs.Host: Cannot bind parameter 'competitionsTable' to type CloudTable. Make >sure the parameter Type is supported by the binding. If you're using binding extensions (e.g. Azure >Storage, ServiceBus, Timers, etc.) make sure you've called the registration method for the >extension(s) in your startup code (e.g. builder.AddAzureStorage(), builder.AddServiceBus(), >builder.AddTimers(), etc.).

为了让函数在本地工作,我在 Visual Studio 中创建函数后必须执行几个步骤,如下所示:

安装相关的 nuget 包并将 extensionBundle 属性添加到 host.json。主机文件修改为:

{
  "version": "2.0",
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[1.*, 2.0.0)"
  }  
}

local.setting.json

{
    "IsEncrypted": false,
    "Values": {
        "AzureWebJobsStorage": "UseDevelopmentStorage=true",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet"
    }
}

函数:

 [FunctionName("GetCompetitions")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        [Table("DailyFF", Connection = "AzureWebJobsStorage")] CloudTable competitionsTable,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

                    TableQuery<ActiveCompetition> projectionQuery = new TableQuery<ActiveCompetition>().Select(
            new string[] { "RowKey", "Name" });

        var activeCompetitions = await competitionsTable.ExecuteQuerySegmentedAsync(projectionQuery, null);
        List<Competition> competitions = new List<Competition>();  
        foreach(var c in activeCompetitions.Results)
        {
            competitions.Add(new Competition
            {
                Id = c.RowKey,
                Name = c.Name
            });

        }

        return competitions != null
            ? (ActionResult)new OkObjectResult(competitions)
            : new BadRequestObjectResult("Nothing doing, try something else.");
    }

这成功了。我多次成功查询本地 table 存储。

正如我所说,当我返回工作时,它不再适用于抛出的错误。

注意几点: 该函数不使用任何第 3 方库,因此应该没有冲突。 所有库都使用 Windows.Azure.Storage 9.3.1(由 visual studio 生成) 我按照许多文章中的建议尝试了 targeting.Net 标准,但没有任何区别。

可能我在最初编写函数和返回之间安装了 asp.net 核心 3.x 框架,但所有设置似乎都是正确的。

我卡住了,任何help/suggestions感谢,谢谢!

[编辑] 我应该添加一些东西,因为它看起来像是根本问题。当我返回工作功能继续开发时,当我 运行 项目时,会自动安装新版本的 Azure Function CLI。我有点惊讶,我不得不像以前一样添加防火墙例外。 不知道安装的是哪个版本。 我已经尝试设置一个新的配置文件并指向从 github 下载的最新版本的 CLI(这带来了自己的问题,因为我必须从 properties\launchSettings.[=63 手动删除现有的配置文件=] 让它工作)。但是它并没有解决函数绑定问题。

在我看来,这种情况有很多不可靠的地方 "fixes" 所以我非常感谢任何链接到 visual studio 2017 年开发的 azure 函数的工作演示。

现在不得不说,我对使用函数有点谨慎。 2 天的工作,正在工作的东西变成了母马,甚至没有触及工作功能。

刚找到这个:

IQueryable isn't supported in the Functions v2 runtime. An alternative is to use a CloudTable method parameter to read the table by using the Azure Storage SDK. Here's an example of a 2.x function that queries an Azure Functions log table:

If you try to bind to CloudTable and get an error message, make sure that you have a reference to the correct Storage SDK version.

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-table

所以我想通了,但仍然不确定为什么它会工作然后停止工作而没有任何更改..

我删除了对 host.json 的更改,因为它说如果您按照此处所述使用 nuget 安装 pacakges,则不需要 extensionBundles

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-register#vs

If you use Install-Package to reference a binding, you don't need to use extension bundles. This approach is specific for class libraries built in Visual Studio.

我读过,但由于该功能有效,我没有太注意它。删除

  "extensionBundle": {
  "id": "Microsoft.Azure.Functions.ExtensionBundle",
 "version": "[1.*, 2.0.0)"
}

将 host.json 文件保留在其初始生成状态修复了该问题。