【问题标题】:Azure Functions - table storage binding not workingAzure Functions - 表存储绑定不起作用
【发布时间】:2019-12-05 18:35:02
【问题描述】:

在 azure 函数中绑定表存储似乎是一个常见问题。我已经阅读了很多关于堆栈溢出的答案,例如

Why is Azure Function v2 unable to bind to CloudTable?

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

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

Microsoft.Azure.WebJobs.Host:索引方法“GetCompetitions”出错。 >Microsoft.Azure.WebJobs.Host:无法将参数“competitionsTable”绑定到类型 CloudTable。确保 > 确保绑定支持参数类型。如果您使用绑定扩展(例如 Azure >Storage、ServiceBus、Timers 等),请确保您已在启动代码中调用 >extension(s) 的注册方法(例如 builder.AddAzureStorage()、builder. AddServiceBus()、>builder.AddTimers() 等)。

在 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.");
    }

这行得通。我多次成功查询本地表存储。

正如我所说,当我返回工作时,它不再与提到的错误一起工作。

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

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

我被卡住了,感谢任何帮助/建议,谢谢!

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

在我看来,这种情况有很多不可靠的“修复”,所以我非常感谢任何指向在 Visual Studio 2017 中开发的 azure 函数的工作演示的链接。

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

【问题讨论】:

  • Windows.Azure.Storage 是旧包。尝试改用 Microsoft.Azure.Storage
  • 对造成的混乱表示歉意。我正在使用 Microsoft.WindowsAzure.Storage.Table;
  • 这是相同的并且是旧的,不应该与 dotnetcore 3x 一起使用。您应该使用“Microsoft.Azure.Storage”包
  • Thiago,再次感谢,但我没有使用 .net core 3.x,我只是将它安装用于其他用途。该组件与 Microsoft.Azure.Webjobs.Extensions (3.0.10) 和是需要的版本 9.3.1,因为在这些 pacakges 中依赖于该版本。 .
  • 还有 - 我让它工作了。所以发生了一些我不知道的变化。没有添加任何表存储功能的 vanilla 函数具有完全相同的包并按预期工作。

标签: c# azure function azure-table-storage


【解决方案1】:

所以我想通了,但仍然不确定它为什么会起作用,然后在没有任何变化的情况下停止工作..

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

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

如果使用 Install-Package 引用绑定,则不需要使用扩展 捆绑。这种方法特定于在 Visual Studio 中构建的类库。

我读过它,但由于该功能起作用,我并没有过多关注它。删除

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

将 host.json 文件保留在最初生成的状态可以解决问题。

【讨论】:

    【解决方案2】:

    刚刚找到这个:

    Functions v2 运行时不支持 IQueryable。替代 是使用 CloudTable 方法参数通过使用 Azure 存储 SDK。这是一个 2.x 函数的示例,它查询 Azure Functions 日志表:

    如果您尝试绑定到 CloudTable 并收到错误消息,请确保 您有正确的存储 SDK 版本的参考。

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

    【讨论】:

    • 感谢您的回复,我在开始开发该功能之前阅读了该内容。遵循它以使最初的工作正常。并重新阅读它和链接的文档。他们都说同样的话,nuget版本冲突(或缺少设置)是可能的原因..这里似乎不是这种情况,因为没有冲突并且所有必需的设置都存在且正确 - 我让它工作,单元测试等。我还检查了源代码控制,在我离开它做其他事情的几天内没有任何变化。唯一改变的是我安装了 .netcore 3.x
    猜你喜欢
    • 2018-08-02
    • 2017-10-29
    • 2021-11-02
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多