我在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天的工作,正在工作的东西变成了母马,甚至没有触及工作功能。
刚刚找到这个:
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
所以我知道了,但是仍然不确定为什么能工作,然后停止工作,没有任何改变。。
我删除了对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文件保留在其最初生成的状态下可以解决此问题。