预编译的 Azure 函数和 CloudTable 绑定输出不起作用
Precompiled Azure function and CloudTable binding output doesn't work
我使用的是预编译的 Azure 函数,它看起来像:
public static async Task Run(Stream inputBlob, Stream outputJson, Stream outputXml, CloudTable schedulerTable)
输出绑定看起来:
{
"name": "schedulerTable",
"type": "table",
"direction": "out",
"tableName": "SchedulerTable",
"connection": "SchedulerTable"
}
当我从我的函数中删除参数 schedulerTable 时,它起作用了。 ´主持人扔在我脸上的信息是:
Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.InputFileAdaptorAF'. Microsoft.Azure.WebJobs.Host: Can't bind Table to type 'Microsoft.WindowsAzure.Storage.Table.CloudTable'.
真的,当我尝试使用不同的替代方法添加 table 输出绑定时,没有任何效果。不起作用的替代方案是:
- SchedulerRegister 类型的参数 schedulerTable。 class SchedulerRegister 继承自 TableEntity。
- 类型为 ICollector 的参数 schedulerTable。
- CloudTable 类型的参数 schedulerTable。 (以上案例)
请问,我该如何解决? (使用输出绑定到 azure table)
您可能 运行 遇到类型不匹配问题。您使用的是什么版本的存储 SDK?您需要确保存储 SDK 引用与运行时期望的相匹配,目前是 7.2.1。
请确保您引用的是存储 SDK 版本 7.2.1。
根据您的描述,我已经测试了这个关于绑定到 table 输出的问题,我可以让它按预期工作。这是我的代码片段,你可以参考它。
function.json
{
"bindings": [
{
"name": "inputBlob",
"type": "blobTrigger",
"direction": "in",
"path": "input/{name}",
"connection": "AzureStorageConnectionString"
},
{
"type": "table",
"name": "outTable",
"tableName": "UploadFile",
"connection": "AzureStorageConnectionString",
"direction": "out"
}
],
"disabled": false
}
ICollector<T>
#r "Microsoft.WindowsAzure.Storage"
using Microsoft.WindowsAzure.Storage.Table;
using Microsoft.WindowsAzure.Storage.Blob;
public static void Run(CloudBlockBlob inputBlob, ICollector<UploadFile> outTable, TraceWriter log)
{
string blobUri=inputBlob.StorageUri.PrimaryUri.ToString();
log.Info($"C# Blob trigger function triggered, blob path: {blobUri}");
outTable.Add(new UploadFile()
{
PartitionKey = "Functions",
RowKey = Guid.NewGuid().ToString(),
Name = blobUri
});
}
public class UploadFile : TableEntity
{
public string Name { get; set; }
}
CloudTable
#r "Microsoft.WindowsAzure.Storage"
using Microsoft.WindowsAzure.Storage.Table;
using Microsoft.WindowsAzure.Storage.Blob;
public static void Run(CloudBlockBlob inputBlob,CloudTable outTable, TraceWriter log)
{
string blobUri=inputBlob.StorageUri.PrimaryUri.ToString();
log.Info($"C# Blob trigger function triggered, blob path: {blobUri}");
outTable.Execute(TableOperation.Insert(new UploadFile()
{
PartitionKey = "Functions",
RowKey = Guid.NewGuid().ToString(),
Name = blobUri
}));
}
public class UploadFile : TableEntity
{
public string Name { get; set; }
}
修改你的代码,点击保存,如果编译执行成功,那么当函数被触发时,你会看到如下日志,记录被添加到AzureTable 存储。
有关更多详细信息,您可以参考官方document关于存储table Azure 功能绑定。
真的,这个答案来自 Azure Functions 团队中的某个人(我不记得名字了),在这个问题中,但他删除了她的回复。他说,问题肯定出在预期的 dll 版本不同。我可以确认这些就是问题所在。
解决方案是检查AppData\Local\Azure.Functions.Cli.0.0-beta.91中使用的dll版本,并在解决方案中使用相同的版本。
我使用的是预编译的 Azure 函数,它看起来像:
public static async Task Run(Stream inputBlob, Stream outputJson, Stream outputXml, CloudTable schedulerTable)
输出绑定看起来:
{
"name": "schedulerTable",
"type": "table",
"direction": "out",
"tableName": "SchedulerTable",
"connection": "SchedulerTable"
}
当我从我的函数中删除参数 schedulerTable 时,它起作用了。 ´主持人扔在我脸上的信息是:
Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.InputFileAdaptorAF'. Microsoft.Azure.WebJobs.Host: Can't bind Table to type 'Microsoft.WindowsAzure.Storage.Table.CloudTable'.
真的,当我尝试使用不同的替代方法添加 table 输出绑定时,没有任何效果。不起作用的替代方案是:
- SchedulerRegister 类型的参数 schedulerTable。 class SchedulerRegister 继承自 TableEntity。
- 类型为 ICollector 的参数 schedulerTable。
- CloudTable 类型的参数 schedulerTable。 (以上案例)
请问,我该如何解决? (使用输出绑定到 azure table)
您可能 运行 遇到类型不匹配问题。您使用的是什么版本的存储 SDK?您需要确保存储 SDK 引用与运行时期望的相匹配,目前是 7.2.1。
请确保您引用的是存储 SDK 版本 7.2.1。
根据您的描述,我已经测试了这个关于绑定到 table 输出的问题,我可以让它按预期工作。这是我的代码片段,你可以参考它。
function.json
{
"bindings": [
{
"name": "inputBlob",
"type": "blobTrigger",
"direction": "in",
"path": "input/{name}",
"connection": "AzureStorageConnectionString"
},
{
"type": "table",
"name": "outTable",
"tableName": "UploadFile",
"connection": "AzureStorageConnectionString",
"direction": "out"
}
],
"disabled": false
}
ICollector<T>
#r "Microsoft.WindowsAzure.Storage"
using Microsoft.WindowsAzure.Storage.Table;
using Microsoft.WindowsAzure.Storage.Blob;
public static void Run(CloudBlockBlob inputBlob, ICollector<UploadFile> outTable, TraceWriter log)
{
string blobUri=inputBlob.StorageUri.PrimaryUri.ToString();
log.Info($"C# Blob trigger function triggered, blob path: {blobUri}");
outTable.Add(new UploadFile()
{
PartitionKey = "Functions",
RowKey = Guid.NewGuid().ToString(),
Name = blobUri
});
}
public class UploadFile : TableEntity
{
public string Name { get; set; }
}
CloudTable
#r "Microsoft.WindowsAzure.Storage"
using Microsoft.WindowsAzure.Storage.Table;
using Microsoft.WindowsAzure.Storage.Blob;
public static void Run(CloudBlockBlob inputBlob,CloudTable outTable, TraceWriter log)
{
string blobUri=inputBlob.StorageUri.PrimaryUri.ToString();
log.Info($"C# Blob trigger function triggered, blob path: {blobUri}");
outTable.Execute(TableOperation.Insert(new UploadFile()
{
PartitionKey = "Functions",
RowKey = Guid.NewGuid().ToString(),
Name = blobUri
}));
}
public class UploadFile : TableEntity
{
public string Name { get; set; }
}
修改你的代码,点击保存,如果编译执行成功,那么当函数被触发时,你会看到如下日志,记录被添加到AzureTable 存储。
有关更多详细信息,您可以参考官方document关于存储table Azure 功能绑定。
真的,这个答案来自 Azure Functions 团队中的某个人(我不记得名字了),在这个问题中,但他删除了她的回复。他说,问题肯定出在预期的 dll 版本不同。我可以确认这些就是问题所在。
解决方案是检查AppData\Local\Azure.Functions.Cli.0.0-beta.91中使用的dll版本,并在解决方案中使用相同的版本。