[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-eac7f1fd-325d-42fd-8c34-9fdeba436f55":3,"$fvqUYQR703dPXR61hee8jMtmh71QRqL9wDrAAXEIfn5Q":43},{"id":4,"title":5,"description":6,"categoryId":7,"moduleId":8,"tags":9,"prompt":10,"icon":11,"source":12,"sourceUrl":13,"authorId":14,"authorName":15,"isPublic":16,"stars":17,"runs":18,"createdAt":19,"updatedAt":19,"module":20,"category":27,"packages":34},"eac7f1fd-325d-42fd-8c34-9fdeba436f55","azure-servicebus-dotnet","Azure Service Bus SDK for .NET。企业级消息队列、主题、订阅和会话。","cat_coding_devops","mod_coding","sickn33,coding","---\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\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.\n","","imported","https:\u002F\u002Fgithub.com\u002Fsickn33\u002Fantigravity-awesome-skills","user_system_seed","SkillOPIC",true,113,1562,"2026-05-16 13:07:41",{"id":8,"name":21,"slug":22,"icon":23,"description":24,"sort":25,"createdAt":26},"编程开发","coding","mdi-code-braces","代码生成、调试、审查，提升开发效率",2,"2026-05-16 12:53:40",{"id":7,"name":28,"slug":29,"icon":30,"description":31,"moduleId":8,"sort":32,"skillCount":33,"createdAt":26},"DevOps","devops","mdi-cog-outline","CI\u002FCD、容器化、部署运维",3,162,[35],{"id":36,"skillId":4,"version":37,"fileName":38,"fileSize":39,"filePath":40,"fileHash":41,"manifest":42,"createdAt":19},"4c48635a-88ba-4e2f-9387-1de49256efd2","1.0.0","azure-servicebus-dotnet.zip",3548,"uploads\u002Fskills\u002Feac7f1fd-325d-42fd-8c34-9fdeba436f55\u002Fazure-servicebus-dotnet.zip","ac32dcbe6a1ad0f7e87f6e57ab63d643ad287fa2d812cb105e766e44099c11a4","[{\"path\":\"SKILL.md\",\"isDirectory\":false,\"size\":10691}]",{"code":44,"message":45,"data":46},200,"success",{"items":47,"stats":48,"page":51},[],{"averageRating":49,"totalRatings":49,"ratingCounts":50},0,[49,49,49,49,49],{"limit":52,"offset":49,"hasMore":53,"nextOffset":52,"ratedOnly":16},15,false]