azure f# azure-functions

Aplicación de función Azure: no se puede enlazar Cola para escribir ''Microsoft.WindowsAzure.Storage.Queue.CloudQueue''(IBinder)



f# azure-functions (1)

Sospecho que tiene problemas de versiones porque trae una versión conflictiva del SDK de almacenamiento. En su lugar, use el integrado (sin incluir ningún paquete nuget). Este código funciona sin 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

Esto se vinculará a la cuenta de almacenamiento predeterminada (la que creamos para usted cuando se creó su aplicación de función). Si desea apuntar a una cuenta de almacenamiento diferente, deberá crear una matriz de atributos e incluir un StorageAccountAttribute que apunte a su cuenta de almacenamiento deseada (por ejemplo, new StorageAccountAttribute("your_storage") ). A continuación, transfiere esta matriz de atributos (con el atributo de cola primero en la matriz) a la sobrecarga de BindAsync que toma una matriz de atributos. Mira aquí para más detalles.

Sin embargo, si no necesita hacer un análisis / formateo sofisticado para formar el nombre de la cola, no creo que necesite usar Binder para esto . Puede enlazar a la cola completamente declarativamente. Aquí está la función.json y el código:

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

Y el código de función:

#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

Mi escenario para una función de Azure:

  1. Activador HTTP
  2. En base a los parámetros HTTP, quiero leer los mensajes de una cola de almacenamiento apropiada y devolver los datos.

Aquí está el código de la función (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

La compilación tiene éxito (con referencias NuGet correctas y paquetes de apertura), pero obtengo la excepción de tiempo de ejecución:

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

Mi código se basa en un ejemplo de este artículo .

¿Qué estoy haciendo mal?

Actualización: ahora me doy cuenta de que no he especificado Nombre de Conexión en ninguna parte. ¿Necesito un enlace para el IBinder de cola basado en IBinder ?

Actualización 2: mi archivo function.json :

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