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 文件保留在其初始生成状态修复了该问题。
我有一个似乎是在 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 文件保留在其初始生成状态修复了该问题。