[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7180ZTHN7TAMZFJ9K114C9F":3,"skill-same:01M7180ZTHN7TAMZFJ9K114C9F":62},{"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":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":42,"commitSha":43,"skillDirectory":44,"forksCount":14,"repositoryHtmlUrl":45,"repositoryHomepageUrl":6,"ownerHtmlUrl":46,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":47,"install":48,"resources":61},"01M7180ZTHN7TAMZFJ9K114C9F","azure-servicebus-dotnet",null,"Azure Service Bus SDK for .NET. Enterprise messaging with queues, topics, subscriptions, and sessions.","sapsapshen\u002Fai-memory-router","sapsapshen","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20347959?v=4","01M6XDQEF1DP50DKF37H81J3J5","shenmian","01M6XDQEJPE41Y3DT2763X8ZJN",0,"MIT","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fglobal\u002Fazure-servicebus-dotnet\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"dotnet","azure","azure servicebus dotnet","2026","sdk","queues","topics","unknown","for","with","service","azure service bus","community","subscriptions","Enterprise","messaging","sessions","2026-11-10 10:12:30",false,"---\nname: azure-servicebus-dotnet\ndescription: Azure Service Bus SDK for .NET. Enterprise messaging with queues, topics, subscriptions, and sessions.\nrisk: unknown\nsource: community\ndate_added: '2026-02-27'\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\n# Or connection string (less secure)\nAZURE_SERVICEBUS_CONNECTION_STRING=Endpoint=sb:\u002F\u002F...\n```\n\n## Authentication\n\n### Microsoft Entra ID (Recommended)\n\n```csharp\nusing Azure.Identity;\nusing Azure.Messaging.ServiceBus;\n\nstring fullyQualifiedNamespace = \"\u003Cnamespace>.servicebus.windows.net\";\nawait using ServiceBusClient client = new(fullyQualifiedNamespace, new DefaultAzureCredential());\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\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\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\n# Or connection string (less secure)\nAZURE_SERVICEBUS_CONNECTION_STRING=Endpoint=sb:\u002F\u002F...\n```\n\n## Authentication\n\n### Microsoft Entra ID (Recommended)\n\n```csharp\nusing Azure.Identity;\nusing Azure.Messaging.ServiceBus;\n\nstring fullyQualifiedNamespace = \"\u003Cnamespace>.servicebus.windows.net\";\nawait using ServiceBusClient client = new(fullyQualifiedNamespace, new DefaultAzureCredential());\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\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n",{"name":5,"risk":26,"source":31,"date_added":41,"description":7},"2026-02-27","main","7a38d8e7073e61c16eda85681cb32fb68a8657a5","skills-store\u002Fglobal\u002Fazure-servicebus-dotnet","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router","https:\u002F\u002Fgithub.com\u002Fsapsapshen","2026-04-14 21:12:12",{"source":8,"skillName":5,"commands":49,"prompt":59,"zipAvailable":60},[50,53,56],{"tool":51,"command":52},"npx","npx skills add sapsapshen\u002Fai-memory-router --skill azure-servicebus-dotnet",{"tool":54,"command":55},"bunx","bunx skills add sapsapshen\u002Fai-memory-router --skill azure-servicebus-dotnet",{"tool":57,"command":58},"pnpm","pnpm dlx skills add sapsapshen\u002Fai-memory-router --skill azure-servicebus-dotnet","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fglobal\u002Fazure-servicebus-dotnet\u002FSKILL.md",true,[],[63,86,112,122,135,154],{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":74,"publishedAt":36},"01M71ATQRKG48SH06FQ697T5G9","wechat-search","Search WeChat Official Account articles using OpenClaw's web search and fetch capabilities with compliance-focused design.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fwechat-search-release\u002FSKILL.md",[69],{"categoryNo":70,"categoryName":71,"taxonomyType":72,"taxonomyTypeDesc":73},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[75,76,77,78,79,80,81,82,83,84,85,28],"wechat search","wechat","search","capabilities","openclaw","design","web search","compliance","web","official","fetch",{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":36},"01M71ATNAVGZB35PFYM2GC5N00","trend-tap","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend tap', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-tap\u002FSKILL.md",[],[93,94,95,96,97,98,77,99,100,101,102,103,104,105,106,107,108,109,110,111],"trend","trend tap","tap","api keys","Bash","time","trending","hacker","aggregator","do","when","brew","live","data","google","install","read","across","api",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":36},"01M71ATJ9AM5KM15AA8PS302EB","trend-radar","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend pulse', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-radar\u002FSKILL.md",[],[119,120,93,104,105,106,107,97,77,109,121,110,111,103,101,100,99,108,98,96],"trend radar","radar","pulse",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":36},"01M71ATGF095N3EJM9G8SD0BB5","tech-news-daily","每日科技新闻汇——从全球多个 RSS 源抓取最新科技新闻，翻译（英→中）、去重、排版成每日简报。当用户询问科技新闻、科技新鲜事、每日科技、技术动态、Daily Tech News 或类似表达时触发此技能。","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftech-news-daily\u002FSKILL.md",[],[129,130,131,132,133,134],"news","tech","tech news daily","daily","rss","翻译",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":146,"publishedAt":36},"01M71ATFAEAMQ17M70NQNY7SR8","summarize","Summarize URLs or files with the summarize CLI (web, PDFs, images, audio, YouTube).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsummarize\u002FSKILL.md",[141],{"categoryNo":142,"categoryName":143,"taxonomyType":144,"taxonomyTypeDesc":145},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",[137,83,147,148,149,28,104,150,151,152,95,153,108],"Audio","cli","youtube","images","https","files","pdfs",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":36},"01M71ATDNS3R0M4H936PACQAWZ","sonoscli","Control Sonos speakers (discover\u002Fstatus\u002Fplay\u002Fvolume\u002Fgroup).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsonoscli\u002FSKILL.md",[],[156,161,162,163,108,164,151,165,166,167,168,169],"status","play","go","latest","github","discover","control","cmd","volume"]