Storage queue trigger not firing in .NET isolated Azure Functions app, works locally
I’m deploying a new .NET isolated Azure Functions app and I’m stuck on a problem where my storage queue triggers never fire in Azure, even though the same project works locally in VS Code.
I’d appreciate help understanding what I might be missing.
Environment
Azure Functions runtime: v4
Worker model: .NET isolated
Target framework: .NET 9 (net9.0)
OS: Linux
Hosting plan: Flex Consumption (Linux)
Key packages:
- Microsoft.Azure.Functions.Worker 2.51.0
- Microsoft.Azure.Functions.Worker.Sdk 2.0.7
- Microsoft.Azure.Functions.Worker.Extensions.Storage 6.8.0
- Microsoft.Azure.Functions.Worker.Extensions.DurableTask 1.11.0
Storage:
- One storage account (call it
appdataaccount) that holds business queues, e.g.orders-queue, email-messages, etc. - A separate storage account is used for
AzureWebJobsStorage/ Durable state. - The
appdataaccountstorage account is in a different subscription/resource group than the Function App, but in the same AAD tenant.
Code (queue trigger)
A simplified version of my queue-triggered function:
public static class OrderProcessorFunction
{
[Function("OrderProcessorFunction")]
public static async Task RunAsync(
[QueueTrigger("orders-queue", Connection = "QueueStorageAccount")]
string orderMessage,
FunctionContext context)
{
var log = context.GetLogger<OrderProcessorFunction>();
log.LogInformation("Processing order: {OrderMessage}", orderMessage);
// ... business logic ...
}
}
There are similar triggers for other queues (e.g. email-messages), all using Connection = "QueueStorageAccount".
Configuration (Azure App Settings)
For QueueStorageAccount I’ve tried two approaches.
Using a connection string
-
QueueStorageAccount= connection string for theappdataaccountstorage account (standard storage account; connection string verified: I can list/add messages via Storage Explorer). -
QueueStorageAccount__accountNameandQueueStorageAccount__credentialare not set. In the Function’s Integration blade forOrderProcessorFunction: - Binding type: Azure Queue Storage
- Storage account connection:
QueueStorageAccount(shows as configured, no warning) - Queue name:
orders-queue
**
Using managed identity (earlier attempt)**
-
QueueStorageAccount__accountName=appdataaccount -
QueueStorageAccount__credential=managedidentity -
QueueStorageAccount(no suffix) not set. - The Function App’s system-assigned managed identity has the Storage Queue Data Contributor role on the
appdataaccountstorage account. In both setups:The target queueorders-queueexists inappdataaccount. - Manually enqueued messages show up in the queue.
-
DequeueCountstays at 0 for all messages.
What works
- The project runs fine locally in VS Code (.NET isolated worker,
func start), targeting:- Azurite, or
- A real Azure Storage account via connection string.
- An HTTP-triggered function in the same app runs in Azure and successfully enqueues messages into
orders-queueusing a helper like:
public static async Task<Response<SendReceipt>> EnqueueOrderAsync(string message)
{
return await _ordersQueueClient.SendMessageAsync(message);
}
After calling the HTTP function, I can see new messages in orders-queue in the appdataaccount storage account.
So enqueueing from this Function App to the queue works in Azure.
What doesn’t work
- In Azure, the
OrderProcessorFunction:- Is listed in the Functions blade.
- Status is Enabled.
- Shows no invocations in the Monitor tab (past 30 days).
- Messages remain in
orders-queueindefinitely;DequeueCountis 0, even after: - Restarting the Function App.
- Redeploying the app (fresh publish).
- Manually adding test messages like
"hello world"to the queue.
There is no corresponding poison queue (e.g. orders-queue-poison), which suggests the trigger never runs at all.
Diagnostics and logs
- Application Insights traces show:
- At startup: a list of discovered functions, including something like
Host.Functions.OrderProcessorFunction. - Occasionally:
Stopped the listener 'Microsoft.Azure.WebJobs.Script.Description.FunctionGroupListenerDecorator+NoOpListener' for function 'OrderProcessorFunction'.
- At startup: a list of discovered functions, including something like
- I do not see:
- “Error indexing method 'OrderProcessorFunction' …”
- “The listener for function 'OrderProcessorFunction' was unable to start …”
- “Storage account connection string 'QueueStorageAccount' is missing or invalid …”
- Any exceptions where
operation_NameisOrderProcessorFunction.
When I enqueue “bogus” messages like "hello world" to orders-queue, I would expect at least a deserialization error and an invocation, but there are no invocations recorded at all.
Question
Given:
- The code and triggers work locally.
- The app in Azure can write to the queue (using the same connection name/config), but never reads from it.
- The function is enabled, there are visible messages, but no invocations and no obvious indexing errors.
Is there anything specific to:
- .NET isolated + Microsoft.Azure.Functions.Worker.Extensions.Storage 6.8.0,
- My hosting plan (Flex Consumption, Linux), or
- Using a storage account in a different subscription,
that would cause the queue trigger to end up with a NoOpListener and never actually poll/process messages, even though the binding appears valid in the Integration blade?
What additional diagnostics or configuration would you recommend to help me understand why this queue-triggered function is never being invoked in Azure?