You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

云托管网站如何用.NET Standard编程创建Service Bus订阅?

How to Programmatically Create a Service Bus Topic Subscription with .NET Standard

Great question! I’ve tackled this exact scenario when scaling out cloud-hosted web app instances that needed dedicated Service Bus Topic subscriptions for message listening. Here’s a practical, clean approach using .NET Standard:

First, Set Up the Dependencies

For .NET Standard 2.0+, use the official Azure Service Bus administration NuGet package—it’s fully supported and handles all management operations:

Install-Package Azure.Messaging.ServiceBus.Administration

Reusable Subscription Creation Logic

Below is a helper class that handles checking for existing subscriptions and creating new ones. The key here is ensuring each instance gets a unique subscription name (critical to avoid conflicts) and configuring sensible defaults for cloud-hosted scenarios:

using Azure.Messaging.ServiceBus.Administration;
using System;
using System.Threading.Tasks;

public class ServiceBusSubscriptionManager
{
    private readonly ServiceBusAdministrationClient _adminClient;
    private readonly string _topicName;

    public ServiceBusSubscriptionManager(string serviceBusConnectionString, string topicName)
    {
        _adminClient = new ServiceBusAdministrationClient(serviceBusConnectionString);
        _topicName = topicName;
    }

    public async Task CreateInstanceSubscriptionAsync(string instanceSubscriptionName)
    {
        try
        {
            // Avoid redundant creation by checking existence first
            var subscriptionExists = await _adminClient.SubscriptionExistsAsync(_topicName, instanceSubscriptionName);
            
            if (!subscriptionExists)
            {
                var subscriptionOptions = new CreateSubscriptionOptions(_topicName, instanceSubscriptionName)
                {
                    // Auto-cleanup unused subscriptions (ideal for ephemeral cloud instances)
                    AutoDeleteOnIdle = TimeSpan.FromDays(7),
                    // Route expired messages to dead-letter queue for debugging
                    DeadLetteringOnMessageExpiration = true
                };

                // Optional: Add a filter if you want this instance to only receive targeted messages
                var instanceFilter = new SqlRuleFilter($"InstanceId = '{instanceSubscriptionName}'");
                await _adminClient.CreateSubscriptionAsync(subscriptionOptions, instanceFilter);
                
                Console.WriteLine($"Created dedicated subscription: {instanceSubscriptionName} for topic {_topicName}");
            }
            else
            {
                Console.WriteLine($"Subscription {instanceSubscriptionName} already exists—skipping creation");
            }
        }
        catch (ServiceBusException ex) when (ex.Reason == ServiceBusFailureReason.AuthorizationFailed)
        {
            Console.WriteLine("Permission error: Your connection string lacks rights to create subscriptions. Ensure it has the 'Manage' claim or use a policy with appropriate permissions.");
            throw;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Unexpected error creating subscription: {ex.Message}");
            throw;
        }
    }
}

Integrate with Your Web App Instance

Call this logic during your app’s startup (e.g., Program.cs or Startup.cs) to create the subscription before starting message listening:

// Pull configuration from environment variables (best practice for cloud hosting)
var serviceBusConnString = Environment.GetEnvironmentVariable("SERVICE_BUS_CONNECTION_STRING");
var targetTopic = "your-app-topic";
// Use a cloud-provided instance ID (like Azure App Service's WEBSITE_INSTANCE_ID) or generate a unique ID
var instanceSubscriptionName = Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID") ?? Guid.NewGuid().ToString();

var subscriptionManager = new ServiceBusSubscriptionManager(serviceBusConnString, targetTopic);
await subscriptionManager.CreateInstanceSubscriptionAsync(instanceSubscriptionName);

// Now use this subscription name to initialize your message receiver

Critical Best Practices

  • Unique Naming: Always use a cloud-provided instance identifier (if available) instead of random GUIDs—this makes debugging easier if you need to trace messages to a specific instance.
  • Permissions: Your Service Bus connection string needs at least Manage rights (or a custom policy with subscription creation permissions). Avoid using the root namespace policy for security.
  • Cleanup: For auto-scaled or ephemeral instances, rely on AutoDeleteOnIdle to remove unused subscriptions automatically—this prevents clutter in your Service Bus namespace.

内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:17:07