【发布时间】: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