Azure Function App:无法绑定队列以键入“Microsoft.WindowsAzure.Storage.Queue.CloudQueue”(IBinder)

时间:2017-02-17 08:38:12

标签: azure f# azure-functions

我的Azure功能方案:

  1. HTTP触发器。
  2. 根据HTTP参数,我想从适当的存储队列中读取消息并返回数据。
  3. 这是函数的代码(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的示例。

    我做错了什么?

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

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

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

1 个答案:

答案 0 :(得分:3)

我怀疑你有版本问题,因为你引入了一个冲突版本的Storage 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

这将绑定到默认存储帐户(我们在创建功能应用程序时为您创建的帐户)。如果您要指向其他存储帐户,则需要创建属性数组,并添加指向所需存储帐户的StorageAccountAttribute(例如{{1} })。然后,将此数组属性(在数组中首先使用queue属性)传递到带有属性数组的new StorageAccountAttribute("your_storage")重载中。有关详细信息,请参阅here

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

BindAsync

功能代码:

{
  "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"
    }
  ]
}