3
votes

I'm trying to create Azure Function 2.0 with multiple bindings. The function gets triggered by Azure Service Bus Queue message and I would like to read Blob based on this message content. I've already tried below code:

public static class Functions
{
    [FunctionName(nameof(MyFunctionName))]
    public static async Task MyFunctionName(
        [ServiceBusTrigger(Consts.QueueName, Connection = Consts.ServiceBusConnection)] string message,
        [Blob("container/{message}-xyz.txt", FileAccess.Read, Connection = "StorageConnName")] string blobContent
    )
    {
        // processing the blob content
    }
}

but I'm getting following error:

Microsoft.Azure.WebJobs.Host: Error indexing method 'MyFunctionName'. Microsoft.Azure.WebJobs.Host: Unable to resolve binding parameter 'message'. Binding expressions must map to either a value provided by the trigger or a property of the value the trigger is bound to, or must be a system binding expression (e.g. sys.randguid, sys.utcnow, etc.).

I saw somewhere that dynamic bindings can be used but perhaps it's not possible to create input binding based on another input binding. Any ideas?

1

1 Answers

1
votes

I'm actually surprise that did not work. There are lots of quirks with bindings. Please give this a shot:

public static class Functions
{
    [FunctionName(nameof(MyFunctionName))]
    public static async Task MyFunctionName(
        [ServiceBusTrigger(Consts.QueueName, Connection = Consts.ServiceBusConnection)] MyConcreteMessage message,
        [Blob("container/{message}-xyz.txt", FileAccess.Read, Connection = "StorageConnName")] string blobContent
    )
    {
        // processing the blob content
    }
}

Create a DTO:

public class MyConcreteMessage 
{
    public string message {get;set;}
}

Ensure that the message that you are using in the servicebus is something like this:

{
  "message": "MyAwesomeFile"
}

It should now be able to read your binding container/{message}-xyz.txt and recognize that message