![]() |
VOOZH | about |
dotnet add package Microsoft.Azure.WebJobs.Extensions.ServiceBus --version 5.17.0
NuGet\Install-Package Microsoft.Azure.WebJobs.Extensions.ServiceBus -Version 5.17.0
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.17.0" />
<PackageVersion Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" Version="5.17.0" />Directory.Packages.props
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.ServiceBus" />Project file
paket add Microsoft.Azure.WebJobs.Extensions.ServiceBus --version 5.17.0
#r "nuget: Microsoft.Azure.WebJobs.Extensions.ServiceBus, 5.17.0"
#:package Microsoft.Azure.WebJobs.Extensions.ServiceBus@5.17.0
#addin nuget:?package=Microsoft.Azure.WebJobs.Extensions.ServiceBus&version=5.17.0Install as a Cake Addin
#tool nuget:?package=Microsoft.Azure.WebJobs.Extensions.ServiceBus&version=5.17.0Install as a Cake Tool
This extension provides functionality for accessing Azure Service Bus from an Azure Function.
Install the Service Bus extension with NuGet:
dotnet add package Microsoft.Azure.WebJobs.Extensions.ServiceBus
Azure Subscription: To use Azure services, including Azure Service Bus, you'll need a subscription. If you do not have an existing Azure account, you may sign up for a free trial or use your Visual Studio Subscription benefits when you create an account.
Service Bus namespace: To interact with Azure Service Bus, you'll also need to have a namespace available. If you are not familiar with creating Azure resources, you may wish to follow the step-by-step guide for creating a Service Bus namespace using the Azure portal. There, you can also find detailed instructions for using the Azure CLI, Azure PowerShell, or Azure Resource Manager (ARM) templates to create a Service bus entity.
To quickly create the needed Service Bus resources in Azure and to receive a connection string for them, you can deploy our sample template by clicking:
For the Service Bus client library to interact with a queue or topic, it will need to understand how to connect and authorize with it. The easiest means for doing so is to use a connection string, which is created automatically when creating a Service Bus namespace. If you aren't familiar with shared access policies in Azure, you may wish to follow the step-by-step guide to get a Service Bus connection string.
The Connection property of ServiceBusAttribute and ServiceBusTriggerAttribute is used to specify the configuration property that stores the connection string. If not specified, the property AzureWebJobsServiceBus is expected to contain the connection string.
For local development, use the local.settings.json file to store the connection string:
{
"Values": {
"<connection_name>": "Endpoint=sb://<service_bus_namespace>.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=<access key>"
}
}
When deployed, use the application settings to set the connection string.
If your environment has managed identity enabled you can use it to authenticate the Service Bus extension. Before doing so, you will need to ensure that permissions have been configured as described in the Azure Functions developer guide.
To use identity-based authentication provide the <connection_name>__fullyQualifiedNamespace configuration setting.
{
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"<connection_name>__fullyQualifiedNamespace": "<service_bus_namespace>.servicebus.windows.net"
}
}
Or in the case of deployed app set the same setting in application settings:
<connection_name>__fullyQualifiedNamespace=<service_bus_namespace>.servicebus.windows.net
More details about configuring an identity-based connection can be found here.
The Service Bus Trigger allows a function to be executed when a message is sent to a Service Bus queue or topic.
Please follow the Azure Service Bus trigger tutorial to learn more about Service Bus triggers.
The Service Bus Output Binding allows a function to send Service Bus messages.
Please follow the Azure Service Bus output binding to learn more about Service Bus bindings.
You can send individual messages to a queue or topic by applying the ServiceBus attribute to the function return value. The return value can be of type string, byte[], or ServiceBusMessage.
[FunctionName("BindingToReturnValue")]
[return: ServiceBus("<queue_or_topic_name>", Connection = "<connection_name>")]
public static string BindToReturnValue([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer)
{
// This value would get stored in Service Bus message body.
// The string would be UTF8 encoded.
return $"C# Timer trigger function executed at: {DateTime.Now}";
}
You can also use an out parameter of type string, byte[], or ServiceBusMessage.
[FunctionName("BindingToOutputParameter")]
public static void Run(
[TimerTrigger("0 */5 * * * *")] TimerInfo myTimer,
[ServiceBus("<queue_or_topic_name>", Connection = "<connection_name>")] out ServiceBusMessage message)
{
message = new ServiceBusMessage($"C# Timer trigger function executed at: {DateTime.Now}");
}
To send multiple messages from a single Azure Function invocation you can apply the ServiceBus attribute to the IAsyncCollector<string> or IAsyncCollector<ServiceBusReceivedMessage> parameter.
[FunctionName("BindingToCollector")]
public static async Task Run(
[TimerTrigger("0 */5 * * * *")] TimerInfo myTimer,
[ServiceBus("<queue_or_topic_name>", Connection = "<connection_name>")] IAsyncCollector<ServiceBusMessage> collector)
{
// IAsyncCollector allows sending multiple messages in a single function invocation
await collector.AddAsync(new ServiceBusMessage(new BinaryData($"Message 1 added at: {DateTime.Now}")));
await collector.AddAsync(new ServiceBusMessage(new BinaryData($"Message 2 added at: {DateTime.Now}")));
}
To use strongly-typed model classes with the ServiceBus binding apply the ServiceBus attribute to the model parameter. Doing so will attempt to deserialize the ServiceBusMessage.Bodyinto the strongly-typed model.
[FunctionName("TriggerSingleModel")]
public static void Run(
[ServiceBusTrigger("<queue_name>", Connection = "<connection_name>")] Dog dog,
ILogger logger)
{
logger.LogInformation($"Who's a good dog? {dog.Name} is!");
}
You can also bind to the ServiceBusSender directly to have the most control over message sending.
[FunctionName("BindingToSender")]
public static async Task Run(
[TimerTrigger("0 */5 * * * *")] TimerInfo myTimer,
[ServiceBus("<queue_or_topic_name>", Connection = "<connection_name>")] ServiceBusSender sender)
{
await sender.SendMessagesAsync(new[]
{
new ServiceBusMessage(new BinaryData($"Message 1 added at: {DateTime.Now}")),
new ServiceBusMessage(new BinaryData($"Message 2 added at: {DateTime.Now}"))
});
}
To run a function every time a message is sent to a Service Bus queue or subscription apply the ServiceBusTrigger attribute to a string, byte[], or ServiceBusReceivedMessage parameter.
[FunctionName("TriggerSingle")]
public static void Run(
[ServiceBusTrigger("<queue_name>", Connection = "<connection_name>")] string messageBodyAsString,
ILogger logger)
{
logger.LogInformation($"C# function triggered to process a message: {messageBodyAsString}");
}
To run a function for a batch of received messages apply the ServiceBusTrigger attribute to a string[], or ServiceBusReceivedMessage[] parameter.
[FunctionName("TriggerBatch")]
public static void Run(
[ServiceBusTrigger("<queue_name>", Connection = "<connection_name>")] ServiceBusReceivedMessage[] messages,
ILogger logger)
{
foreach (ServiceBusReceivedMessage message in messages)
{
logger.LogInformation($"C# function triggered to process a message: {message.Body}");
logger.LogInformation($"EnqueuedTime={message.EnqueuedTime}");
}
}
You can configure messages to be automatically completed after your function executes using the ServiceBusOptions. If you want more control over message settlement, you can bind to the MessageActions with both per-message and batch triggers.
[FunctionName("BindingToMessageActions")]
public static async Task Run(
[ServiceBusTrigger("<queue_name>", Connection = "<connection_name>")]
ServiceBusReceivedMessage[] messages,
ServiceBusMessageActions messageActions)
{
foreach (ServiceBusReceivedMessage message in messages)
{
if (message.MessageId == "1")
{
await messageActions.DeadLetterMessageAsync(message);
}
else
{
await messageActions.CompleteMessageAsync(message);
}
}
}
To receive messages from a session enabled queue or topic, you can set the IsSessionsEnabled
property on the ServiceBusTrigger attribute. When working with sessions, you can bind to the SessionMessageActions to get access to the message settlement methods in addition to session-specific functionality.
[FunctionName("BindingToSessionMessageActions")]
public static async Task Run(
[ServiceBusTrigger("<queue_name>", Connection = "<connection_name>", IsSessionsEnabled = true)]
ServiceBusReceivedMessage[] messages,
ServiceBusSessionMessageActions sessionActions)
{
foreach (ServiceBusReceivedMessage message in messages)
{
if (message.MessageId == "1")
{
await sessionActions.DeadLetterMessageAsync(message);
}
else
{
await sessionActions.CompleteMessageAsync(message);
}
}
// We can also perform session-specific operations using the actions, such as setting state that is specific to this session.
await sessionActions.SetSessionStateAsync(new BinaryData("<session state>"));
}
It's possible to receive additional messages from within your function invocation. This may be useful if you need more control over how many messages to process within a function invocation based on some characteristics of the initial message delivered to your function via the binding parameter. Any additional messages that you receive will be subject to the same AutoCompleteMessages and MaxAutoLockRenewalDuration configuration as the initial message delivered to your function. It is also possible to peek messages. Peeked messages are not subject to the AutoCompleteMessages and MaxAutoLockRenewalDuration configuration as these messages are not locked and therefore cannot be completed.
[FunctionName("BindingToReceiveActions")]
public static async Task Run(
[ServiceBusTrigger("<queue_name>", Connection = "<connection_name>", IsSessionsEnabled = true)]
ServiceBusReceivedMessage message,
ServiceBusMessageActions messageActions,
ServiceBusReceiveActions receiveActions)
{
if (message.MessageId == "1")
{
await messageActions.DeadLetterMessageAsync(message);
}
else
{
await messageActions.CompleteMessageAsync(message);
// attempt to receive additional messages in this session
var receivedMessages = await receiveActions.ReceiveMessagesAsync(maxMessages: 10);
// you can also use the receive actions to peek messages
var peekedMessages = await receiveActions.PeekMessagesAsync(maxMessages: 10);
}
}
There may be times when you want to bind to the same ServiceBusClient that the trigger is using. This can be useful if you need to dynamically create a sender based on the message that is received.
[FunctionName("BindingToClient")]
public static async Task Run(
[ServiceBus("<queue_or_topic_name>", Connection = "<connection_name>")]
ServiceBusReceivedMessage message,
ServiceBusClient client)
{
ServiceBusSender sender = client.CreateSender(message.To);
await sender.SendMessageAsync(new ServiceBusMessage(message));
}
If your function triggers an unhandled exception and you haven't already settled the message, the extension will attempt to abandon the message so that it becomes available for receiving again immediately.
Please refer to Monitor Azure Functions for more troubleshooting guidance.
Read the introduction to Azure Functions or creating an Azure Function guide.
See our CONTRIBUTING.md for details on building, testing, and contributing to this library.
This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit cla.microsoft.com.
This project has adopted the Microsoft Open Source Code of Conduct. For more information see the Code of Conduct FAQ or contact with any additional questions or comments.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 net5.0 was computed. net5.0-windows net5.0-windows was computed. net6.0 net6.0 was computed. net6.0-android net6.0-android was computed. net6.0-ios net6.0-ios was computed. net6.0-maccatalyst net6.0-maccatalyst was computed. net6.0-macos net6.0-macos was computed. net6.0-tvos net6.0-tvos was computed. net6.0-windows net6.0-windows was computed. net7.0 net7.0 was computed. net7.0-android net7.0-android was computed. net7.0-ios net7.0-ios was computed. net7.0-maccatalyst net7.0-maccatalyst was computed. net7.0-macos net7.0-macos was computed. net7.0-tvos net7.0-tvos was computed. net7.0-windows net7.0-windows was computed. net8.0 net8.0 is compatible. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 was computed. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 was computed. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 netcoreapp2.0 was computed. netcoreapp2.1 netcoreapp2.1 was computed. netcoreapp2.2 netcoreapp2.2 was computed. netcoreapp3.0 netcoreapp3.0 was computed. netcoreapp3.1 netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 netstandard2.0 is compatible. netstandard2.1 netstandard2.1 was computed. |
| .NET Framework | net461 net461 was computed. net462 net462 was computed. net463 net463 was computed. net47 net47 was computed. net471 net471 was computed. net472 net472 was computed. net48 net48 was computed. net481 net481 was computed. |
| MonoAndroid | monoandroid monoandroid was computed. |
| MonoMac | monomac monomac was computed. |
| MonoTouch | monotouch monotouch was computed. |
| Tizen | tizen40 tizen40 was computed. tizen60 tizen60 was computed. |
| Xamarin.iOS | xamarinios xamarinios was computed. |
| Xamarin.Mac | xamarinmac xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos xamarinwatchos was computed. |
Showing the top 5 NuGet packages that depend on Microsoft.Azure.WebJobs.Extensions.ServiceBus:
| Package | Downloads |
|---|---|
|
MassTransit.WebJobs.ServiceBus
MassTransit Azure WebJobs Service Bus support; MassTransit provides a developer-focused, modern platform for creating distributed applications without complexity. |
|
|
NServiceBus.AzureFunctions.InProcess.ServiceBus
NServiceBus.AzureFunctions.InProcess.ServiceBus |
|
|
Microsoft.Azure.Workflows.WebJobs.Extension
Extensions for running workflows in Azure Functions |
|
|
Energinet.DataHub.Core.Messaging
[Release Notes](https://github.com/Energinet-DataHub/geh-core/blob/master/source/Messaging/documents/release-notes/release-notes.md) [Documentation](https://github.com/Energinet-DataHub/geh-core/blob/master/source/Messaging/documents/documentation.md) |
|
|
CoreEx.Azure
CoreEx .NET Azure Extensions. |
Showing the top 15 popular GitHub repositories that depend on Microsoft.Azure.WebJobs.Extensions.ServiceBus:
| Repository | Stars |
|---|---|
|
MassTransit/MassTransit
Distributed Application Framework for .NET
|
|
|
Azure/azure-webjobs-sdk
Azure WebJobs SDK
|
|
|
WolfgangOfner/MicroserviceDemo
This is a demo with two ASP .NET 6 microservices using RabbitMQ and Docker
|
|
|
Chinchilla-Software-Com/CQRS
A lightweight enterprise Function as a Service (FaaS) framework to write function based serverless and micro-service applications in hybrid multi-datacentre, on-premise and Azure environments.
|
|
|
OfficeDev/microsoft-teams-apps-company-communicator
Company Communicator app template
|
|
| rstropek/Samples | |
|
JamesRandall/FunctionMonkey
Write more elegant Azure Functions with less boilerplate, more consistency, and support for REST APIs. Docs can be found at https://functionmonkey.azurefromthetrenches.com
|
|
|
Daniel-Krzyczkowski/Cars-Island-On-Azure
Cars Island is a fake car rental company which used Microsoft Azure cloud services to implement the system for managing car renting.
|
|
|
azuredevcollege/trainingdays
Azure Developer College's application development training days content.
|
|
|
alex-on-ai/WebReaper
AI-native web scraper. Single binary with a bundled Claude Code skill. MIT-licensed alternative to Firecrawl.
|
|
|
aliostad/BeeHive
A Reactive Cloud Actor library/mini-framework for .NET 4.5.2+ or .NET Standard 2.0+
|
|
|
newrelic/newrelic-dotnet-agent
The New Relic .NET language agent.
|
|
|
microsoftgraph/group-membership-management
Group Membership Management (GMM) is a service that dynamically manages the membership of AAD Groups. Groups managed by GMM can have their membership defined using existing AAD Groups and/or custom membership sources.
|
|
| jorgevgut/curso_backend_platzi | |
|
jongio/memealyzer
Memealyzer is an app built to demonstrate some the latest and greatest Azure tech to dev, debug, and deploy microservice applications.
|
| Version | Downloads | Last Updated |
|---|---|---|
| 5.17.0 | 6,549,857 | 6/20/2025 |
| 5.16.6 | 688,571 | 4/8/2025 |
| 5.16.5 | 2,420,937 | 3/14/2025 |
| 5.16.4 | 10,930,294 | 8/8/2024 |
| 5.16.3 | 220,250 | 8/2/2024 |
| 5.16.2 | 172,006 | 7/25/2024 |
| 5.16.1 | 2,316,210 | 6/13/2024 |
| 5.16.0 | 600,763 | 5/30/2024 |
| 5.15.1 | 1,653,350 | 4/17/2024 |
| 5.14.0 | 977,629 | 3/14/2024 |
| 5.13.6 | 197,643 | 3/5/2024 |
| 5.13.5 | 4,169,647 | 12/4/2023 |
| 5.13.4 | 1,800,221 | 11/9/2023 |
| 5.13.3 | 1,247,914 | 10/20/2023 |
| 5.13.2 | 99,652 | 10/18/2023 |
| 5.13.1 | 341,235 | 10/17/2023 |
| 5.13.0 | 105,819 | 10/11/2023 |
| 5.12.0 | 1,859,001 | 8/14/2023 |
| 5.11.0 | 2,081,379 | 6/6/2023 |
| 5.10.0 | 454,542 | 5/10/2023 |