gpt4 book ai didi

Azure函数应用程序: Can't bind Queue to type 'Microsoft.WindowsAzure.Storage.Queue.CloudQueue' (IBinder)

转载 作者:行者123 更新时间:2023-12-03 01:08:07 28 4
gpt4 key购买 nike

我的 Azure 函数场景:

  1. HTTP 触发器。
  2. 基于 HTTP 参数,我想从适当的存储队列读取消息并返回数据。

这是函数的代码(F#):

let Run(request: string, customerId: int, userName: string, binder: IBinder) =
let subscriberKey = sprintf "%i-%s" customerId userName
let attribute = new QueueAttribute(subscriberKey)
let queue = binder.Bind<CloudQueue>(attribute)
() //TODO: read messages from the queue

编译成功(使用正确的 NuGet 引用和打开包),但出现运行时异常:

Microsoft.Azure.WebJobs.Host: 
Can't bind Queue to type 'Microsoft.WindowsAzure.Storage.Queue.CloudQueue'.

我的代码基于 this article 中的示例.

我做错了什么?

更新:现在我意识到我没有在任何地方指定连接名称。我是否需要绑定(bind)基于 IBinder 的队列访问?

更新 2:我的 function.json 文件:

{
"bindings": [
{
"type": "httpTrigger",
"name": "request",
"route": "retrieve/{customerId}/{userName}",
"authLevel": "function",
"methods": [
"get"
],
"direction": "in"
}
],
"disabled": false
}

最佳答案

我怀疑您遇到版本控制问题,因为您引入了有冲突的存储 SDK 版本。相反,使用内置的(无需引入任何 nuget 包)。此代码无需使用project.json即可工作:

#r "Microsoft.WindowsAzure.Storage"

open Microsoft.Azure.WebJobs;
open Microsoft.WindowsAzure.Storage.Queue;

let Run(request: string, customerId: int, userName: string, binder: IBinder) =
async {
let subscriberKey = sprintf "%i-%s" customerId userName
let attribute = new QueueAttribute(subscriberKey)
let! queue = binder.BindAsync<CloudQueue>(attribute) |> Async.AwaitTask
() //TODO: read messages from the queue
} |> Async.RunSynchronously

这将绑定(bind)到默认存储帐户(我们在创建 Function App 时为您创建的帐户)。如果您想指向不同的存储帐户,则需要创建一个属性数组,并包含一个指向所需存储帐户的 StorageAccountAttribute(例如 new StorageAccountAttribute("your_storage"))。然后,将此属性数组(队列属性位于数组中的第一个)传递到采用属性数组的 BindAsync 重载中。请参阅here了解更多详情。

但是,如果您不需要进行任何复杂的解析/格式化来形成队列名称,我认为您甚至不需要为此使用 Binder。您可以完全以声明方式绑定(bind)到队列。这是 function.json 和代码:

{
"bindings": [
{
"type": "httpTrigger",
"name": "request",
"route": "retrieve/{customerId}/{userName}",
"authLevel": "function",
"methods": [
"get"
],
"direction": "in"
},
{
"type": "queue",
"name": "queue",
"queueName": "{customerId}-{userName}",
"connection": "<your_storage>",
"direction": "in"
}
]
}

函数代码:

#r "Microsoft.WindowsAzure.Storage"

open Microsoft.Azure.WebJobs;
open Microsoft.WindowsAzure.Storage.Queue;

let Run(request: string, queue: CloudQueue) =
async {
() //TODO: read messages from the queue
} |> Async.RunSynchronously

关于Azure函数应用程序: Can't bind Queue to type 'Microsoft.WindowsAzure.Storage.Queue.CloudQueue' (IBinder),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42293109/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com