Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Azure Functions dynamic input / output binding based on Service Bus trigger message content

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?

like image 777
mickl Avatar asked Dec 04 '25 08:12

mickl


1 Answers

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

like image 86
Alex Gordon Avatar answered Dec 07 '25 00:12

Alex Gordon