|
Add this skill
npx mdskills install sickn33/azure-servicebus-dotnetComprehensive Azure Service Bus SDK documentation with excellent code examples and patterns
1---2name: azure-servicebus-dotnet3description: |4 Azure Service Bus SDK for .NET. Enterprise messaging with queues, topics, subscriptions, and sessions. Use for reliable message delivery, pub/sub patterns, dead letter handling, and background processing. Triggers: "Service Bus", "ServiceBusClient", "ServiceBusSender", "ServiceBusReceiver", "ServiceBusProcessor", "message queue", "pub/sub .NET", "dead letter queue".5package: Azure.Messaging.ServiceBus6---78# Azure.Messaging.ServiceBus (.NET)910Enterprise messaging SDK for reliable message delivery with queues, topics, subscriptions, and sessions.1112## Installation1314```bash15dotnet add package Azure.Messaging.ServiceBus16dotnet add package Azure.Identity17```1819**Current Version**: v7.20.1 (stable)2021## Environment Variables2223```bash24AZURE_SERVICEBUS_FULLY_QUALIFIED_NAMESPACE=<namespace>.servicebus.windows.net25# Or connection string (less secure)26AZURE_SERVICEBUS_CONNECTION_STRING=Endpoint=sb://...27```2829## Authentication3031### Microsoft Entra ID (Recommended)3233```csharp34using Azure.Identity;35using Azure.Messaging.ServiceBus;3637string fullyQualifiedNamespace = "<namespace>.servicebus.windows.net";38await using ServiceBusClient client = new(fullyQualifiedNamespace, new DefaultAzureCredential());39```4041### Connection String4243```csharp44string connectionString = "<connection_string>";45await using ServiceBusClient client = new(connectionString);46```4748### ASP.NET Core Dependency Injection4950```csharp51services.AddAzureClients(builder =>52{53 builder.AddServiceBusClientWithNamespace("<namespace>.servicebus.windows.net");54 builder.UseCredential(new DefaultAzureCredential());55});56```5758## Client Hierarchy5960```61ServiceBusClient62├── CreateSender(queueOrTopicName) → ServiceBusSender63├── CreateReceiver(queueName) → ServiceBusReceiver64├── CreateReceiver(topicName, subName) → ServiceBusReceiver65├── AcceptNextSessionAsync(queueName) → ServiceBusSessionReceiver66├── CreateProcessor(queueName) → ServiceBusProcessor67└── CreateSessionProcessor(queueName) → ServiceBusSessionProcessor6869ServiceBusAdministrationClient (separate client for CRUD)70```7172## Core Workflows7374### 1. Send Messages7576```csharp77await using ServiceBusClient client = new(fullyQualifiedNamespace, new DefaultAzureCredential());78ServiceBusSender sender = client.CreateSender("my-queue");7980// Single message81ServiceBusMessage message = new("Hello world!");82await sender.SendMessageAsync(message);8384// Safe batching (recommended)85using ServiceBusMessageBatch batch = await sender.CreateMessageBatchAsync();86if (batch.TryAddMessage(new ServiceBusMessage("Message 1")))87{88 // Message added successfully89}90if (batch.TryAddMessage(new ServiceBusMessage("Message 2")))91{92 // Message added successfully93}94await sender.SendMessagesAsync(batch);95```9697### 2. Receive Messages9899```csharp100ServiceBusReceiver receiver = client.CreateReceiver("my-queue");101102// Single message103ServiceBusReceivedMessage message = await receiver.ReceiveMessageAsync();104string body = message.Body.ToString();105Console.WriteLine(body);106107// Complete the message (removes from queue)108await receiver.CompleteMessageAsync(message);109110// Batch receive111IReadOnlyList<ServiceBusReceivedMessage> messages = await receiver.ReceiveMessagesAsync(maxMessages: 10);112foreach (var msg in messages)113{114 Console.WriteLine(msg.Body.ToString());115 await receiver.CompleteMessageAsync(msg);116}117```118119### 3. Message Settlement120121```csharp122// Complete - removes message from queue123await receiver.CompleteMessageAsync(message);124125// Abandon - releases lock, message can be received again126await receiver.AbandonMessageAsync(message);127128// Defer - prevents normal receive, use ReceiveDeferredMessageAsync129await receiver.DeferMessageAsync(message);130131// Dead Letter - moves to dead letter subqueue132await receiver.DeadLetterMessageAsync(message, "InvalidFormat", "Message body was not valid JSON");133```134135### 4. Background Processing with Processor136137```csharp138ServiceBusProcessor processor = client.CreateProcessor("my-queue", new ServiceBusProcessorOptions139{140 AutoCompleteMessages = false,141 MaxConcurrentCalls = 2142});143144processor.ProcessMessageAsync += async (args) =>145{146 try147 {148 string body = args.Message.Body.ToString();149 Console.WriteLine($"Received: {body}");150 await args.CompleteMessageAsync(args.Message);151 }152 catch (Exception ex)153 {154 Console.WriteLine($"Error processing: {ex.Message}");155 await args.AbandonMessageAsync(args.Message);156 }157};158159processor.ProcessErrorAsync += (args) =>160{161 Console.WriteLine($"Error source: {args.ErrorSource}");162 Console.WriteLine($"Entity: {args.EntityPath}");163 Console.WriteLine($"Exception: {args.Exception}");164 return Task.CompletedTask;165};166167await processor.StartProcessingAsync();168// ... application runs169await processor.StopProcessingAsync();170```171172### 5. Sessions (Ordered Processing)173174```csharp175// Send session message176ServiceBusMessage message = new("Hello")177{178 SessionId = "order-123"179};180await sender.SendMessageAsync(message);181182// Receive from next available session183ServiceBusSessionReceiver receiver = await client.AcceptNextSessionAsync("my-queue");184185// Or receive from specific session186ServiceBusSessionReceiver receiver = await client.AcceptSessionAsync("my-queue", "order-123");187188// Session state management189await receiver.SetSessionStateAsync(new BinaryData("processing"));190BinaryData state = await receiver.GetSessionStateAsync();191192// Renew session lock193await receiver.RenewSessionLockAsync();194```195196### 6. Dead Letter Queue197198```csharp199// Receive from dead letter queue200ServiceBusReceiver dlqReceiver = client.CreateReceiver("my-queue", new ServiceBusReceiverOptions201{202 SubQueue = SubQueue.DeadLetter203});204205ServiceBusReceivedMessage dlqMessage = await dlqReceiver.ReceiveMessageAsync();206207// Access dead letter metadata208string reason = dlqMessage.DeadLetterReason;209string description = dlqMessage.DeadLetterErrorDescription;210Console.WriteLine($"Dead letter reason: {reason} - {description}");211```212213### 7. Topics and Subscriptions214215```csharp216// Send to topic217ServiceBusSender topicSender = client.CreateSender("my-topic");218await topicSender.SendMessageAsync(new ServiceBusMessage("Broadcast message"));219220// Receive from subscription221ServiceBusReceiver subReceiver = client.CreateReceiver("my-topic", "my-subscription");222var message = await subReceiver.ReceiveMessageAsync();223```224225### 8. Administration (CRUD)226227```csharp228var adminClient = new ServiceBusAdministrationClient(229 fullyQualifiedNamespace,230 new DefaultAzureCredential());231232// Create queue233var options = new CreateQueueOptions("my-queue")234{235 MaxDeliveryCount = 10,236 LockDuration = TimeSpan.FromSeconds(30),237 RequiresSession = true,238 DeadLetteringOnMessageExpiration = true239};240QueueProperties queue = await adminClient.CreateQueueAsync(options);241242// Update queue243queue.LockDuration = TimeSpan.FromSeconds(60);244await adminClient.UpdateQueueAsync(queue);245246// Create topic and subscription247await adminClient.CreateTopicAsync(new CreateTopicOptions("my-topic"));248await adminClient.CreateSubscriptionAsync(new CreateSubscriptionOptions("my-topic", "my-subscription"));249250// Delete251await adminClient.DeleteQueueAsync("my-queue");252```253254### 9. Cross-Entity Transactions255256```csharp257var options = new ServiceBusClientOptions { EnableCrossEntityTransactions = true };258await using var client = new ServiceBusClient(connectionString, options);259260ServiceBusReceiver receiverA = client.CreateReceiver("queueA");261ServiceBusSender senderB = client.CreateSender("queueB");262263ServiceBusReceivedMessage receivedMessage = await receiverA.ReceiveMessageAsync();264265using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))266{267 await receiverA.CompleteMessageAsync(receivedMessage);268 await senderB.SendMessageAsync(new ServiceBusMessage("Forwarded"));269 ts.Complete();270}271```272273## Key Types Reference274275| Type | Purpose |276|------|---------|277| `ServiceBusClient` | Main entry point, manages connection |278| `ServiceBusSender` | Sends messages to queues/topics |279| `ServiceBusReceiver` | Receives messages from queues/subscriptions |280| `ServiceBusSessionReceiver` | Receives session messages |281| `ServiceBusProcessor` | Background message processing |282| `ServiceBusSessionProcessor` | Background session processing |283| `ServiceBusAdministrationClient` | CRUD for queues/topics/subscriptions |284| `ServiceBusMessage` | Message to send |285| `ServiceBusReceivedMessage` | Received message with metadata |286| `ServiceBusMessageBatch` | Batch of messages |287288## Best Practices2892901. **Use singletons** — Clients, senders, receivers, and processors are thread-safe2912. **Always dispose** — Use `await using` or call `DisposeAsync()`2923. **Dispose order** — Close senders/receivers/processors first, then client2934. **Use DefaultAzureCredential** — Prefer over connection strings for production2945. **Use processors for background work** — Handles lock renewal automatically2956. **Use safe batching** — `CreateMessageBatchAsync()` and `TryAddMessage()`2967. **Handle transient errors** — Use `ServiceBusException.Reason`2978. **Configure transport** — Use `AmqpWebSockets` if ports 5671/5672 are blocked2989. **Set appropriate lock duration** — Default is 30 seconds29910. **Use sessions for ordering** — FIFO within a session300301## Error Handling302303```csharp304try305{306 await sender.SendMessageAsync(message);307}308catch (ServiceBusException ex) when (ex.Reason == ServiceBusFailureReason.ServiceBusy)309{310 // Retry with backoff311}312catch (ServiceBusException ex)313{314 Console.WriteLine($"Service Bus Error: {ex.Reason} - {ex.Message}");315}316```317318## Related SDKs319320| SDK | Purpose | Install |321|-----|---------|---------|322| `Azure.Messaging.ServiceBus` | Service Bus (this SDK) | `dotnet add package Azure.Messaging.ServiceBus` |323| `Azure.Messaging.EventHubs` | Event streaming | `dotnet add package Azure.Messaging.EventHubs` |324| `Azure.Messaging.EventGrid` | Event routing | `dotnet add package Azure.Messaging.EventGrid` |325326## Reference Links327328| Resource | URL |329|----------|-----|330| NuGet Package | https://www.nuget.org/packages/Azure.Messaging.ServiceBus |331| API Reference | https://learn.microsoft.com/dotnet/api/azure.messaging.servicebus |332| GitHub Source | https://github.com/Azure/azure-sdk-for-net/tree/main/sdk/servicebus/Azure.Messaging.ServiceBus |333| Troubleshooting | https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/servicebus/Azure.Messaging.ServiceBus/TROUBLESHOOTING.md |334
Full transparency — inspect the skill content before installing.