[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69AP5D27CBQ7JWVX2MJ533S":3,"skill-same:01M69AP5D27CBQ7JWVX2MJ533S":92},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":53,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M69AP5D27CBQ7JWVX2MJ533S","azure-servicebus-dotnet",null,"Azure Service Bus SDK for .NET. Enterprise messaging with queues, topics, subscriptions, and sessions. Use for reliable message delivery, pub\u002Fsub patterns, dead letter handling, and background processing. Triggers: \"Service Bus\", \"ServiceBusClient\", \"ServiceBusSender\", \"ServiceBusReceiver\", \"ServiceBusProcessor\", \"message queue\", \"pub\u002Fsub .NET\", \"dead letter queue\".","microsoft\u002Fskills","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69AJYYW4E1RMSYCQDJ4FJSH",3202,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-servicebus-dotnet\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,9],"dotnet","azure","azure servicebus dotnet","patterns","queues","topics","letter","for","with","processing","triggers","delivery","message","azure service bus","sdk","subscriptions","use","Enterprise","messaging","sessions","2026-11-10 10:12:30",false,"---\nname: azure-servicebus-dotnet\ndescription: |\n  Azure Service Bus SDK for .NET. Enterprise messaging with queues, topics, subscriptions, and sessions. Use for reliable message delivery, pub\u002Fsub patterns, dead letter handling, and background processing. Triggers: \"Service Bus\", \"ServiceBusClient\", \"ServiceBusSender\", \"ServiceBusReceiver\", \"ServiceBusProcessor\", \"message queue\", \"pub\u002Fsub .NET\", \"dead letter queue\".\nlicense: MIT\nmetadata:\n  author: Microsoft\n  version: \"1.0.0\"\n  package: Azure.Messaging.ServiceBus\n---\n\n# Azure.Messaging.ServiceBus (.NET)\n\nEnterprise messaging SDK for reliable message delivery with queues, topics, subscriptions, and sessions.\n\n## Installation\n\n```bash\ndotnet add package Azure.Messaging.ServiceBus\ndotnet add package Azure.Identity\n```\n\n**Current Version**: v7.20.1 (stable)\n\n## Environment Variables\n\n```bash\nAZURE_SERVICEBUS_FULLY_QUALIFIED_NAMESPACE=\u003Cnamespace>.servicebus.windows.net  # Required: Service Bus fully qualified namespace\nAZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production\nAZURE_SERVICEBUS_CONNECTION_STRING=Endpoint=sb:\u002F\u002F...  # Alternative to Entra ID auth\n```\n\n## Authentication\n\n### Microsoft Entra Token Credential\n\n```csharp\nusing Azure.Identity;\nusing Azure.Messaging.ServiceBus;\n\nstring fullyQualifiedNamespace = \"\u003Cnamespace>.servicebus.windows.net\";\n\u002F\u002F Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=\u003Cspecific_credential>\nvar credential = new DefaultAzureCredential(\n    DefaultAzureCredential.DefaultEnvironmentVariableName\n);\n\u002F\u002F Or use a specific credential directly in production:\n\u002F\u002F See https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Foverview\u002Fazure\u002Fidentity-readme?view=azure-dotnet#credential-classes\n\u002F\u002F var credential = new ManagedIdentityCredential();\nawait using ServiceBusClient client = new(fullyQualifiedNamespace, credential);\n```\n\n### Connection String\n\n```csharp\nstring connectionString = \"\u003Cconnection_string>\";\nawait using ServiceBusClient client = new(connectionString);\n```\n\n### ASP.NET Core Dependency Injection\n\n```csharp\nservices.AddAzureClients(builder =>\n{\n    builder.AddServiceBusClientWithNamespace(\"\u003Cnamespace>.servicebus.windows.net\");\n    builder.UseCredential(new DefaultAzureCredential());\n});\n```\n\n## Client Hierarchy\n\n```\nServiceBusClient\n├── CreateSender(queueOrTopicName)      → ServiceBusSender\n├── CreateReceiver(queueName)           → ServiceBusReceiver\n├── CreateReceiver(topicName, subName)  → ServiceBusReceiver\n├── AcceptNextSessionAsync(queueName)   → ServiceBusSessionReceiver\n├── CreateProcessor(queueName)          → ServiceBusProcessor\n└── CreateSessionProcessor(queueName)   → ServiceBusSessionProcessor\n\nServiceBusAdministrationClient (separate client for CRUD)\n```\n\n## Core Workflows\n\n### 1. Send Messages\n\n```csharp\nawait using ServiceBusClient client = new(fullyQualifiedNamespace, new DefaultAzureCredential());\nServiceBusSender sender = client.CreateSender(\"my-queue\");\n\n\u002F\u002F Single message\nServiceBusMessage message = new(\"Hello world!\");\nawait sender.SendMessageAsync(message);\n\n\u002F\u002F Safe batching (recommended)\nusing ServiceBusMessageBatch batch = await sender.CreateMessageBatchAsync();\nif (batch.TryAddMessage(new ServiceBusMessage(\"Message 1\")))\n{\n    \u002F\u002F Message added successfully\n}\nif (batch.TryAddMessage(new ServiceBusMessage(\"Message 2\")))\n{\n    \u002F\u002F Message added successfully\n}\nawait sender.SendMessagesAsync(batch);\n```\n\n### 2. Receive Messages\n\n```csharp\nServiceBusReceiver receiver = client.CreateReceiver(\"my-queue\");\n\n\u002F\u002F Single message\nServiceBusReceivedMessage message = await receiver.ReceiveMessageAsync();\nstring body = message.Body.ToString();\nConsole.WriteLine(body);\n\n\u002F\u002F Complete the message (removes from queue)\nawait receiver.CompleteMessageAsync(message);\n\n\u002F\u002F Batch receive\nIReadOnlyList\u003CServiceBusReceivedMessage> messages = await receiver.ReceiveMessagesAsync(maxMessages: 10);\nforeach (var msg in messages)\n{\n    Console.WriteLine(msg.Body.ToString());\n    await receiver.CompleteMessageAsync(msg);\n}\n```\n\n### 3. Message Settlement\n\n```csharp\n\u002F\u002F Complete - removes message from queue\nawait receiver.CompleteMessageAsync(message);\n\n\u002F\u002F Abandon - releases lock, message can be received again\nawait receiver.AbandonMessageAsync(message);\n\n\u002F\u002F Defer - prevents normal receive, use ReceiveDeferredMessageAsync\nawait receiver.DeferMessageAsync(message);\n\n\u002F\u002F Dead Letter - moves to dead letter subqueue\nawait receiver.DeadLetterMessageAsync(message, \"InvalidFormat\", \"Message body was not valid JSON\");\n```\n\n### 4. Background Processing with Processor\n\n```csharp\nServiceBusProcessor processor = client.CreateProcessor(\"my-queue\", new ServiceBusProcessorOptions\n{\n    AutoCompleteMessages = false,\n    MaxConcurrentCalls = 2\n});\n\nprocessor.ProcessMessageAsync += async (args) =>\n{\n    try\n    {\n        string body = args.Message.Body.ToString();\n        Console.WriteLine($\"Received: {body}\");\n        await args.CompleteMessageAsync(args.Message);\n    }\n    catch (Exception ex)\n    {\n        Console.WriteLine($\"Error processing: {ex.Message}\");\n        await args.AbandonMessageAsync(args.Message);\n    }\n};\n\nprocessor.ProcessErrorAsync += (args) =>\n{\n    Console.WriteLine($\"Error source: {args.ErrorSource}\");\n    Console.WriteLine($\"Entity: {args.EntityPath}\");\n    Console.WriteLine($\"Exception: {args.Exception}\");\n    return Task.CompletedTask;\n};\n\nawait processor.StartProcessingAsync();\n\u002F\u002F ... application runs\nawait processor.StopProcessingAsync();\n```\n\n### 5. Sessions (Ordered Processing)\n\n```csharp\n\u002F\u002F Send session message\nServiceBusMessage message = new(\"Hello\")\n{\n    SessionId = \"order-123\"\n};\nawait sender.SendMessageAsync(message);\n\n\u002F\u002F Receive from next available session\nServiceBusSessionReceiver receiver = await client.AcceptNextSessionAsync(\"my-queue\");\n\n\u002F\u002F Or receive from specific session\nServiceBusSessionReceiver receiver = await client.AcceptSessionAsync(\"my-queue\", \"order-123\");\n\n\u002F\u002F Session state management\nawait receiver.SetSessionStateAsync(new BinaryData(\"processing\"));\nBinaryData state = await receiver.GetSessionStateAsync();\n\n\u002F\u002F Renew session lock\nawait receiver.RenewSessionLockAsync();\n```\n\n### 6. Dead Letter Queue\n\n```csharp\n\u002F\u002F Receive from dead letter queue\nServiceBusReceiver dlqReceiver = client.CreateReceiver(\"my-queue\", new ServiceBusReceiverOptions\n{\n    SubQueue = SubQueue.DeadLetter\n});\n\nServiceBusReceivedMessage dlqMessage = await dlqReceiver.ReceiveMessageAsync();\n\n\u002F\u002F Access dead letter metadata\nstring reason = dlqMessage.DeadLetterReason;\nstring description = dlqMessage.DeadLetterErrorDescription;\nConsole.WriteLine($\"Dead letter reason: {reason} - {description}\");\n```\n\n### 7. Topics and Subscriptions\n\n```csharp\n\u002F\u002F Send to topic\nServiceBusSender topicSender = client.CreateSender(\"my-topic\");\nawait topicSender.SendMessageAsync(new ServiceBusMessage(\"Broadcast message\"));\n\n\u002F\u002F Receive from subscription\nServiceBusReceiver subReceiver = client.CreateReceiver(\"my-topic\", \"my-subscription\");\nvar message = await subReceiver.ReceiveMessageAsync();\n```\n\n### 8. Administration (CRUD)\n\n```csharp\nvar adminClient = new ServiceBusAdministrationClient(\n    fullyQualifiedNamespace, \n    new DefaultAzureCredential());\n\n\u002F\u002F Create queue\nvar options = new CreateQueueOptions(\"my-queue\")\n{\n    MaxDeliveryCount = 10,\n    LockDuration = TimeSpan.FromSeconds(30),\n    RequiresSession = true,\n    DeadLetteringOnMessageExpiration = true\n};\nQueueProperties queue = await adminClient.CreateQueueAsync(options);\n\n\u002F\u002F Update queue\nqueue.LockDuration = TimeSpan.FromSeconds(60);\nawait adminClient.UpdateQueueAsync(queue);\n\n\u002F\u002F Create topic and subscription\nawait adminClient.CreateTopicAsync(new CreateTopicOptions(\"my-topic\"));\nawait adminClient.CreateSubscriptionAsync(new CreateSubscriptionOptions(\"my-topic\", \"my-subscription\"));\n\n\u002F\u002F Delete\nawait adminClient.DeleteQueueAsync(\"my-queue\");\n```\n\n### 9. Cross-Entity Transactions\n\n```csharp\nvar options = new ServiceBusClientOptions { EnableCrossEntityTransactions = true };\nawait using var client = new ServiceBusClient(connectionString, options);\n\nServiceBusReceiver receiverA = client.CreateReceiver(\"queueA\");\nServiceBusSender senderB = client.CreateSender(\"queueB\");\n\nServiceBusReceivedMessage receivedMessage = await receiverA.ReceiveMessageAsync();\n\nusing (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))\n{\n    await receiverA.CompleteMessageAsync(receivedMessage);\n    await senderB.SendMessageAsync(new ServiceBusMessage(\"Forwarded\"));\n    ts.Complete();\n}\n```\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `ServiceBusClient` | Main entry point, manages connection |\n| `ServiceBusSender` | Sends messages to queues\u002Ftopics |\n| `ServiceBusReceiver` | Receives messages from queues\u002Fsubscriptions |\n| `ServiceBusSessionReceiver` | Receives session messages |\n| `ServiceBusProcessor` | Background message processing |\n| `ServiceBusSessionProcessor` | Background session processing |\n| `ServiceBusAdministrationClient` | CRUD for queues\u002Ftopics\u002Fsubscriptions |\n| `ServiceBusMessage` | Message to send |\n| `ServiceBusReceivedMessage` | Received message with metadata |\n| `ServiceBusMessageBatch` | Batch of messages |\n\n## Best Practices\n\n1. **Use singletons** — Clients, senders, receivers, and processors are thread-safe\n2. **Always dispose** — Use `await using` or call `DisposeAsync()`\n3. **Dispose order** — Close senders\u002Freceivers\u002Fprocessors first, then client\n4. **Use DefaultAzureCredential** — Prefer over connection strings for production\n5. **Use processors for background work** — Handles lock renewal automatically\n6. **Use safe batching** — `CreateMessageBatchAsync()` and `TryAddMessage()`\n7. **Handle transient errors** — Use `ServiceBusException.Reason`\n8. **Configure transport** — Use `AmqpWebSockets` if ports 5671\u002F5672 are blocked\n9. **Set appropriate lock duration** — Default is 30 seconds\n10. **Use sessions for ordering** — FIFO within a session\n\n## Error Handling\n\n```csharp\ntry\n{\n    await sender.SendMessageAsync(message);\n}\ncatch (ServiceBusException ex) when (ex.Reason == ServiceBusFailureReason.ServiceBusy)\n{\n    \u002F\u002F Retry with backoff\n}\ncatch (ServiceBusException ex)\n{\n    Console.WriteLine($\"Service Bus Error: {ex.Reason} - {ex.Message}\");\n}\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `Azure.Messaging.ServiceBus` | Service Bus (this SDK) | `dotnet add package Azure.Messaging.ServiceBus` |\n| `Azure.Messaging.EventHubs` | Event streaming | `dotnet add package Azure.Messaging.EventHubs` |\n| `Azure.Messaging.EventGrid` | Event routing | `dotnet add package Azure.Messaging.EventGrid` |\n\n## Reference Links\n\n| Resource | URL |\n|----------|-----|\n| NuGet Package | https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FAzure.Messaging.ServiceBus |\n| API Reference | https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fazure.messaging.servicebus |\n| GitHub Source | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-net\u002Ftree\u002Fmain\u002Fsdk\u002Fservicebus\u002FAzure.Messaging.ServiceBus |\n| Troubleshooting | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-net\u002Fblob\u002Fmain\u002Fsdk\u002Fservicebus\u002FAzure.Messaging.ServiceBus\u002FTROUBLESHOOTING.md |\n","# Azure.Messaging.ServiceBus (.NET)\n\nEnterprise messaging SDK for reliable message delivery with queues, topics, subscriptions, and sessions.\n\n## Installation\n\n```bash\ndotnet add package Azure.Messaging.ServiceBus\ndotnet add package Azure.Identity\n```\n\n**Current Version**: v7.20.1 (stable)\n\n## Environment Variables\n\n```bash\nAZURE_SERVICEBUS_FULLY_QUALIFIED_NAMESPACE=\u003Cnamespace>.servicebus.windows.net  # Required: Service Bus fully qualified namespace\nAZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production\nAZURE_SERVICEBUS_CONNECTION_STRING=Endpoint=sb:\u002F\u002F...  # Alternative to Entra ID auth\n```\n\n## Authentication\n\n### Microsoft Entra Token Credential\n\n```csharp\nusing Azure.Identity;\nusing Azure.Messaging.ServiceBus;\n\nstring fullyQualifiedNamespace = \"\u003Cnamespace>.servicebus.windows.net\";\n\u002F\u002F Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=\u003Cspecific_credential>\nvar credential = new DefaultAzureCredential(\n    DefaultAzureCredential.DefaultEnvironmentVariableName\n);\n\u002F\u002F Or use a specific credential directly in production:\n\u002F\u002F See https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Foverview\u002Fazure\u002Fidentity-readme?view=azure-dotnet#credential-classes\n\u002F\u002F var credential = new ManagedIdentityCredential();\nawait using ServiceBusClient client = new(fullyQualifiedNamespace, credential);\n```\n\n### Connection String\n\n```csharp\nstring connectionString = \"\u003Cconnection_string>\";\nawait using ServiceBusClient client = new(connectionString);\n```\n\n### ASP.NET Core Dependency Injection\n\n```csharp\nservices.AddAzureClients(builder =>\n{\n    builder.AddServiceBusClientWithNamespace(\"\u003Cnamespace>.servicebus.windows.net\");\n    builder.UseCredential(new DefaultAzureCredential());\n});\n```\n\n## Client Hierarchy\n\n```\nServiceBusClient\n├── CreateSender(queueOrTopicName)      → ServiceBusSender\n├── CreateReceiver(queueName)           → ServiceBusReceiver\n├── CreateReceiver(topicName, subName)  → ServiceBusReceiver\n├── AcceptNextSessionAsync(queueName)   → ServiceBusSessionReceiver\n├── CreateProcessor(queueName)          → ServiceBusProcessor\n└── CreateSessionProcessor(queueName)   → ServiceBusSessionProcessor\n\nServiceBusAdministrationClient (separate client for CRUD)\n```\n\n## Core Workflows\n\n### 1. Send Messages\n\n```csharp\nawait using ServiceBusClient client = new(fullyQualifiedNamespace, new DefaultAzureCredential());\nServiceBusSender sender = client.CreateSender(\"my-queue\");\n\n\u002F\u002F Single message\nServiceBusMessage message = new(\"Hello world!\");\nawait sender.SendMessageAsync(message);\n\n\u002F\u002F Safe batching (recommended)\nusing ServiceBusMessageBatch batch = await sender.CreateMessageBatchAsync();\nif (batch.TryAddMessage(new ServiceBusMessage(\"Message 1\")))\n{\n    \u002F\u002F Message added successfully\n}\nif (batch.TryAddMessage(new ServiceBusMessage(\"Message 2\")))\n{\n    \u002F\u002F Message added successfully\n}\nawait sender.SendMessagesAsync(batch);\n```\n\n### 2. Receive Messages\n\n```csharp\nServiceBusReceiver receiver = client.CreateReceiver(\"my-queue\");\n\n\u002F\u002F Single message\nServiceBusReceivedMessage message = await receiver.ReceiveMessageAsync();\nstring body = message.Body.ToString();\nConsole.WriteLine(body);\n\n\u002F\u002F Complete the message (removes from queue)\nawait receiver.CompleteMessageAsync(message);\n\n\u002F\u002F Batch receive\nIReadOnlyList\u003CServiceBusReceivedMessage> messages = await receiver.ReceiveMessagesAsync(maxMessages: 10);\nforeach (var msg in messages)\n{\n    Console.WriteLine(msg.Body.ToString());\n    await receiver.CompleteMessageAsync(msg);\n}\n```\n\n### 3. Message Settlement\n\n```csharp\n\u002F\u002F Complete - removes message from queue\nawait receiver.CompleteMessageAsync(message);\n\n\u002F\u002F Abandon - releases lock, message can be received again\nawait receiver.AbandonMessageAsync(message);\n\n\u002F\u002F Defer - prevents normal receive, use ReceiveDeferredMessageAsync\nawait receiver.DeferMessageAsync(message);\n\n\u002F\u002F Dead Letter - moves to dead letter subqueue\nawait receiver.DeadLetterMessageAsync(message, \"InvalidFormat\", \"Message body was not valid JSON\");\n```\n\n### 4. Background Processing with Processor\n\n```csharp\nServiceBusProcessor processor = client.CreateProcessor(\"my-queue\", new ServiceBusProcessorOptions\n{\n    AutoCompleteMessages = false,\n    MaxConcurrentCalls = 2\n});\n\nprocessor.ProcessMessageAsync += async (args) =>\n{\n    try\n    {\n        string body = args.Message.Body.ToString();\n        Console.WriteLine($\"Received: {body}\");\n        await args.CompleteMessageAsync(args.Message);\n    }\n    catch (Exception ex)\n    {\n        Console.WriteLine($\"Error processing: {ex.Message}\");\n        await args.AbandonMessageAsync(args.Message);\n    }\n};\n\nprocessor.ProcessErrorAsync += (args) =>\n{\n    Console.WriteLine($\"Error source: {args.ErrorSource}\");\n    Console.WriteLine($\"Entity: {args.EntityPath}\");\n    Console.WriteLine($\"Exception: {args.Exception}\");\n    return Task.CompletedTask;\n};\n\nawait processor.StartProcessingAsync();\n\u002F\u002F ... application runs\nawait processor.StopProcessingAsync();\n```\n\n### 5. Sessions (Ordered Processing)\n\n```csharp\n\u002F\u002F Send session message\nServiceBusMessage message = new(\"Hello\")\n{\n    SessionId = \"order-123\"\n};\nawait sender.SendMessageAsync(message);\n\n\u002F\u002F Receive from next available session\nServiceBusSessionReceiver receiver = await client.AcceptNextSessionAsync(\"my-queue\");\n\n\u002F\u002F Or receive from specific session\nServiceBusSessionReceiver receiver = await client.AcceptSessionAsync(\"my-queue\", \"order-123\");\n\n\u002F\u002F Session state management\nawait receiver.SetSessionStateAsync(new BinaryData(\"processing\"));\nBinaryData state = await receiver.GetSessionStateAsync();\n\n\u002F\u002F Renew session lock\nawait receiver.RenewSessionLockAsync();\n```\n\n### 6. Dead Letter Queue\n\n```csharp\n\u002F\u002F Receive from dead letter queue\nServiceBusReceiver dlqReceiver = client.CreateReceiver(\"my-queue\", new ServiceBusReceiverOptions\n{\n    SubQueue = SubQueue.DeadLetter\n});\n\nServiceBusReceivedMessage dlqMessage = await dlqReceiver.ReceiveMessageAsync();\n\n\u002F\u002F Access dead letter metadata\nstring reason = dlqMessage.DeadLetterReason;\nstring description = dlqMessage.DeadLetterErrorDescription;\nConsole.WriteLine($\"Dead letter reason: {reason} - {description}\");\n```\n\n### 7. Topics and Subscriptions\n\n```csharp\n\u002F\u002F Send to topic\nServiceBusSender topicSender = client.CreateSender(\"my-topic\");\nawait topicSender.SendMessageAsync(new ServiceBusMessage(\"Broadcast message\"));\n\n\u002F\u002F Receive from subscription\nServiceBusReceiver subReceiver = client.CreateReceiver(\"my-topic\", \"my-subscription\");\nvar message = await subReceiver.ReceiveMessageAsync();\n```\n\n### 8. Administration (CRUD)\n\n```csharp\nvar adminClient = new ServiceBusAdministrationClient(\n    fullyQualifiedNamespace, \n    new DefaultAzureCredential());\n\n\u002F\u002F Create queue\nvar options = new CreateQueueOptions(\"my-queue\")\n{\n    MaxDeliveryCount = 10,\n    LockDuration = TimeSpan.FromSeconds(30),\n    RequiresSession = true,\n    DeadLetteringOnMessageExpiration = true\n};\nQueueProperties queue = await adminClient.CreateQueueAsync(options);\n\n\u002F\u002F Update queue\nqueue.LockDuration = TimeSpan.FromSeconds(60);\nawait adminClient.UpdateQueueAsync(queue);\n\n\u002F\u002F Create topic and subscription\nawait adminClient.CreateTopicAsync(new CreateTopicOptions(\"my-topic\"));\nawait adminClient.CreateSubscriptionAsync(new CreateSubscriptionOptions(\"my-topic\", \"my-subscription\"));\n\n\u002F\u002F Delete\nawait adminClient.DeleteQueueAsync(\"my-queue\");\n```\n\n### 9. Cross-Entity Transactions\n\n```csharp\nvar options = new ServiceBusClientOptions { EnableCrossEntityTransactions = true };\nawait using var client = new ServiceBusClient(connectionString, options);\n\nServiceBusReceiver receiverA = client.CreateReceiver(\"queueA\");\nServiceBusSender senderB = client.CreateSender(\"queueB\");\n\nServiceBusReceivedMessage receivedMessage = await receiverA.ReceiveMessageAsync();\n\nusing (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))\n{\n    await receiverA.CompleteMessageAsync(receivedMessage);\n    await senderB.SendMessageAsync(new ServiceBusMessage(\"Forwarded\"));\n    ts.Complete();\n}\n```\n\n## Key Types Reference\n\n| Type | Purpose |\n|------|---------|\n| `ServiceBusClient` | Main entry point, manages connection |\n| `ServiceBusSender` | Sends messages to queues\u002Ftopics |\n| `ServiceBusReceiver` | Receives messages from queues\u002Fsubscriptions |\n| `ServiceBusSessionReceiver` | Receives session messages |\n| `ServiceBusProcessor` | Background message processing |\n| `ServiceBusSessionProcessor` | Background session processing |\n| `ServiceBusAdministrationClient` | CRUD for queues\u002Ftopics\u002Fsubscriptions |\n| `ServiceBusMessage` | Message to send |\n| `ServiceBusReceivedMessage` | Received message with metadata |\n| `ServiceBusMessageBatch` | Batch of messages |\n\n## Best Practices\n\n1. **Use singletons** — Clients, senders, receivers, and processors are thread-safe\n2. **Always dispose** — Use `await using` or call `DisposeAsync()`\n3. **Dispose order** — Close senders\u002Freceivers\u002Fprocessors first, then client\n4. **Use DefaultAzureCredential** — Prefer over connection strings for production\n5. **Use processors for background work** — Handles lock renewal automatically\n6. **Use safe batching** — `CreateMessageBatchAsync()` and `TryAddMessage()`\n7. **Handle transient errors** — Use `ServiceBusException.Reason`\n8. **Configure transport** — Use `AmqpWebSockets` if ports 5671\u002F5672 are blocked\n9. **Set appropriate lock duration** — Default is 30 seconds\n10. **Use sessions for ordering** — FIFO within a session\n\n## Error Handling\n\n```csharp\ntry\n{\n    await sender.SendMessageAsync(message);\n}\ncatch (ServiceBusException ex) when (ex.Reason == ServiceBusFailureReason.ServiceBusy)\n{\n    \u002F\u002F Retry with backoff\n}\ncatch (ServiceBusException ex)\n{\n    Console.WriteLine($\"Service Bus Error: {ex.Reason} - {ex.Message}\");\n}\n```\n\n## Related SDKs\n\n| SDK | Purpose | Install |\n|-----|---------|---------|\n| `Azure.Messaging.ServiceBus` | Service Bus (this SDK) | `dotnet add package Azure.Messaging.ServiceBus` |\n| `Azure.Messaging.EventHubs` | Event streaming | `dotnet add package Azure.Messaging.EventHubs` |\n| `Azure.Messaging.EventGrid` | Event routing | `dotnet add package Azure.Messaging.EventGrid` |\n\n## Reference Links\n\n| Resource | URL |\n|----------|-----|\n| NuGet Package | https:\u002F\u002Fwww.nuget.org\u002Fpackages\u002FAzure.Messaging.ServiceBus |\n| API Reference | https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Fazure.messaging.servicebus |\n| GitHub Source | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-net\u002Ftree\u002Fmain\u002Fsdk\u002Fservicebus\u002FAzure.Messaging.ServiceBus |\n| Troubleshooting | https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-sdk-for-net\u002Fblob\u002Fmain\u002Fsdk\u002Fservicebus\u002FAzure.Messaging.ServiceBus\u002FTROUBLESHOOTING.md |\n",{"name":5,"license":15,"metadata":44,"description":47},{"author":12,"package":45,"version":46},"Azure.Messaging.ServiceBus","1.0.0","Azure Service Bus SDK for .NET. Enterprise messaging with queues, topics, subscriptions, and sessions. Use for reliable message delivery, pub\u002Fsub patterns, dead letter handling, and background processing. Triggers: \"Service Bus\", \"ServiceBusClient\", \"ServiceBusSender\", \"ServiceBusReceiver\", \"ServiceBusProcessor\", \"message queue\", \"pub\u002Fsub .NET\", \"dead letter queue\".\n","main","3f5b461b2314e01c400564051e92469114c5b68f",".github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-servicebus-dotnet",368,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","https:\u002F\u002Fmicrosoft.github.io\u002Fskills\u002F","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-14 02:08:41",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add microsoft\u002Fskills --skill azure-servicebus-dotnet",{"tool":64,"command":65},"bunx","bunx skills add microsoft\u002Fskills --skill azure-servicebus-dotnet",{"tool":67,"command":68},"pnpm","pnpm dlx skills add microsoft\u002Fskills --skill azure-servicebus-dotnet","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-servicebus-dotnet\u002FSKILL.md",true,[72,78,84,88],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"examples\u002Fv1_109.md","REFERENCE","参考文档",3745,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-docs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Frelease-note-writer\u002Fexamples\u002Fv1_109.md",{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"images\u002Fvscode-insiders-banner-medium.png","ASSET","资产文件",130,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-docs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Frelease-note-writer\u002Fimages\u002Fvscode-insiders-banner-medium.png",{"path":85,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":86,"sourceHtmlUrl":87},"images\u002Fvscode-insiders-header.webp",74694,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-docs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Frelease-note-writer\u002Fimages\u002Fvscode-insiders-header.webp",{"path":89,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":90,"sourceHtmlUrl":91},"review-procedure.md",7247,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fvscode-docs\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Frelease-note-writer\u002Freview-procedure.md",[93,119,157,184,204,242],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":104,"publishedAt":39},"01M69B4JCRQV5SPXAFCKXQRV0H","skill-creator","Guide for creating effective skills for AI coding agents working with Azure SDKs and Microsoft Foundry services. Use when creating new skills or updating existing skills.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fskill-creator\u002FSKILL.md",[99],{"categoryNo":100,"categoryName":101,"taxonomyType":102,"taxonomyTypeDesc":103},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[105,106,107,9,108,109,110,20,111,112,113,35,114,27,115,26,116,117,118],"skill creator","creator","coding agents","foundry","microsoft foundry","ai coding agents","services","coding","guide","ai coding","sdks","Existing","when","new",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":135,"publishedAt":39},"01M69B4FD57V1MYKRWAJJECTZ7","podcast-generation","Generate AI-powered podcast-style audio narratives using Azure OpenAI's GPT Realtime Mini model via WebSocket. Use when building text-to-speech features, audio narrative generation, podcast creation from content, or integrating with Azure OpenAI Realtime API for real audio output. Covers full-stack implementation from React frontend to Python FastAPI backend with WebSocket streaming.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fpodcast-generation\u002FSKILL.md",[125,128,131,134],{"categoryNo":126,"categoryName":127,"taxonomyType":102,"taxonomyTypeDesc":103},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":129,"categoryName":130,"taxonomyType":102,"taxonomyTypeDesc":103},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":132,"categoryName":133,"taxonomyType":102,"taxonomyTypeDesc":103},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":100,"categoryName":101,"taxonomyType":102,"taxonomyTypeDesc":103},[136,137,138,139,140,141,142,20,143,144,145,146,147,148,149,150,151,152,153,154,155,117,156],"podcast generation","podcast","generation","frontend","python","react","realtime","azure openai","generate","streaming","api","Audio","stack","text","model","fastapi","creation","python fastapi","narrative","features","fastapi backend",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":164,"publishedAt":39},"01M69B4CYPM5SESY5ZWEFDXEQZ","microsoft-docs","Understand Microsoft technologies by querying official documentation. Use whenever the user asks how something works, wants tutorials, needs configuration options, limits, quotas, or best practices for any Microsoft technology (Azure, .NET, M365, Windows, Power Platform, etc.)—even if they don't mention \"docs.\" If the question is about understanding a concept rather than writing code, this is the right skill.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fmicrosoft-docs\u002FSKILL.md",[163],{"categoryNo":100,"categoryName":101,"taxonomyType":102,"taxonomyTypeDesc":103},[165,9,166,167,168,169,170,171,172,173,174,20,175,176,177,35,178,61,179,180,181,182,183,26],"docs","microsoft docs","MCP","writing","cli","mcp server","windows","power platform","official","documentation","learn","best practices","question","power","back","technology","platform","learn mcp","concept",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":191,"publishedAt":39},"01M69B49C3YPD1ZJ3NC0HPCY58","mcp-builder","Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP), Node\u002FTypeScript (MCP SDK), or C#\u002F.NET (Microsoft MCP SDK).","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fmcp-builder\u002FSKILL.md",[190],{"categoryNo":100,"categoryName":101,"taxonomyType":102,"taxonomyTypeDesc":103},[167,192,193,194,140,195,33,196,9,197,198,150,199,200,113,35,201,202,203,27,26,117],"mcp builder","builder","typescript","llms","model context protocol","fastmcp","Tools","node","context","integrate","mcp sdk","building mcp servers",{"skillNo":205,"name":206,"nameZh":6,"description":207,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":208,"categories":209,"keywords":222,"publishedAt":39},"01M69B467A7CDMFQ0T6Q0ZA12Q","kql","KQL language expertise for writing correct, efficient Kusto Query Language queries. Covers syntax gotchas, join patterns, dynamic types, datetime pitfalls, regex patterns, serialization, memory management, result-size discipline, and advanced functions (geo, vector, graph). USE THIS SKILL whenever writing, debugging, or reviewing KQL queries — even simple ones — because the gotchas section prevents the most common errors that waste tool calls and cause expensive retry cascades. Trigger on: KQL, Kusto, ADX, Azure Data Explorer, Fabric Real-Time Intelligence, EventHouse, Log Analytics, log analysis, data exploration, time series, anomaly detection, summarize, where clause, join, extend, project, let statement, parse operator, extract function, any mention of pipe-forward query syntax.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fkql\u002FSKILL.md",[210,213,214,219],{"categoryNo":211,"categoryName":212,"taxonomyType":102,"taxonomyTypeDesc":103},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":100,"categoryName":101,"taxonomyType":102,"taxonomyTypeDesc":103},{"categoryNo":215,"categoryName":216,"taxonomyType":217,"taxonomyTypeDesc":218},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",{"categoryNo":220,"categoryName":221,"taxonomyType":217,"taxonomyTypeDesc":218},"01JBSEEDCAT000000000000036","内容创作者",[206,168,223,224,225,20,226,227,228,229,230,231,232,233,234,235,236,237,238,26,239,240,241],"summarize","memory","analytics","vector","time series","tool","discipline","log","geo","exploration","pipe","time","project","regex","join","datetime","section","anomaly","parse",{"skillNo":243,"name":244,"nameZh":6,"description":245,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":246,"categories":247,"keywords":248,"publishedAt":39},"01M69B44HJQ7897EZ7NE7DWQX3","github-issue-creator","Convert raw notes, error logs, voice dictation, or screenshots into crisp GitHub-flavored markdown issue reports. Use when the user pastes bug info, error messages, or informal descriptions and wants a structured GitHub issue. Supports images\u002FGIFs for visual evidence.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fgithub-issue-creator\u002FSKILL.md",[],[249,250,251,252,106,253,254,255,256,257,258,259,35,260,261,262,263,264,265,26,117],"github","github issue creator","github issue","issue","issue creator","screenshots","notes","logs","error messages","messages","convert","evidence","reports","images","info","visual","error"]