Azure函数-表存储绑定不起作用

问题描述 投票:0回答:2

我在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,Timer等),请确保已在启动代码(例如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.");
    }

这有效。我成功查询了几次本地表存储。

正如我说的,当我恢复工作时,它不再能解决所提到的错误。

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

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

我很困惑,感谢您的帮助/建议,谢谢!

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

在我看来,此场景有很多不​​可靠的“修复程序,因此,我非常感谢与Visual Studio 2017中开发的Azure功能的工作演示完全相关的任何链接。

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

c# azure function azure-table-storage
2个回答
0
投票

刚刚找到这个:

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

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

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


0
投票

所以我知道了,但是仍然不确定为什么能工作,然后停止工作,没有任何改变。。

我删除了对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文件保留在其最初生成的状态下可以解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.