Getting Started


Configuring an endpoint

To use Azure Service Bus as the underlying transport:

var transport = new AzureServiceBusTransport("Endpoint=sb://[NAMESPACE];SharedAccessKeyName=[KEYNAME];SharedAccessKey=[KEY]");


These settings control how the transport connects to the broker.


  • UseWebSockets: Configures the transport to use AMQP over websockets.
  • WebProxy: Configures an optional web-proxy to use with AMQP over websockets.
  • TimeToWaitBeforeTriggeringCircuitBreaker: The time to wait before triggering the circuit breaker after a critical error occurred. Defaults to 2 minutes.


  • CustomRetryPolicy(RetryPolicy): Allows replacement of the default retry policy.


Enables usage of Microsoft Entra Id authentication such as managed identities for Azure resources instead of the shared secret in the connection string.

var transportWithTokenCredentials = new AzureServiceBusTransport("[NAMESPACE]", new DefaultAzureCredential());

Entity creation

These settings control how the transport creates entities in the Azure Service Bus namespace.

Access rights

The transport can be run without Manage rights when using a shared access policy or without the Azure Service Bus Data Owner role if authenticating using Managed Identities.

To run without manage rights:


  • Topology: The topology used to publish and subscribe to events between endpoints. The topology is shared by the endpoints that need to publish and subscribe to events from each other. Defaults to Topology.DefaultBundle, which represents a single topic called bundle-1.

It is possible to override the single topic topology from the default bundle to a custom bundle:

transport.Topology = TopicTopology.Single(topicName: "custom-bundle");

For large systems that are approaching the topology limits it is possible to create a topology hierarchy:

transport.Topology = TopicTopology.Hierarchy(topicToPublishTo: "custom-publish-bundle", topicToSubscribeOn: "custom-subscribe-bundle");

Topic names must adhere to the limits outlined in the Microsoft documentation on topic creation.


  • EntityMaximumSize: The maximum entity size in GB. The value must correspond to a valid value for the namespace type. Defaults to 5. See the Microsoft documentation on quotas and limits for valid values.

  • EnablePartitioning: Partitioned entities offer higher availability, reliability, and throughput over conventional non-partitioned queues and topics. For more information about partitioned entities see the Microsoft documentation on partitioned messaging entities.

  • SubscriptionNamingConvention(Func<string, string>): By default subscription names are derived from the endpoint name. This callback allows for a replacement name for the subscription. Subscription names must adhere to the limits outlined in the Microsoft documentation on subscription creation.

  • SubscriptionNameShortener(Func<string, string>): Shortens subscription names that exceed the maximum length. The shortener is invoked only when a subscription name exceeds the maximum length.

  • SubscriptionRuleNamingConvention(Func<Type, string>): By default rule names are derived from the message type's full name. This callback allows for a replacement name for the rule. Rule names must adhere to the limits outlined in Service Bus quotas.

  • RuleNameShortener(Func<string, string>): Shortens rule names that exceed the maximum length. The shortener is invoked only when a rule name exceeds the maximum length.

Combining shorteners and naming conventions

When both a shortener and a naming convention are provided for a subscription or subscription rule, the naming convention is applied first, and the result is then passed into the shortener.

Controlling the prefetch count

When consuming messages from the broker, throughput can be improved by having the consumer prefetch additional messages. The prefetch count is calculated by multiplying maximum concurrency by the prefetch multiplier. The default value of the multiplier is 10, but it can be changed by using the following:

transport.PrefetchMultiplier = 3;

Alternatively, the whole calculation can be overridden by setting the prefetch count directly using the following:

transport.PrefetchCount = 100;

To disable prefetching, prefetch count should be set to zero.


For all supported transport transaction modes (except TransportTransactionMode.None), the transport uses a peek-lock mechanism to ensure a single instance of an endpoint can process a message. The default lock duration is specified during the entity creation. By default, the transport uses the SDK's default maximum auto lock renewal duration of 5 minutes.

The lock can be auto-renewed beyond the default by overriding the MaxAutoLockRenewalDuration.

transport.MaxAutoLockRenewalDuration = TimeSpan.FromMinutes(10);