MSMQ to Azure Service Bus Transport Bridge

This page refers to the legacy Azure Service Bus transport, which is rendered obsolete by the Azure Service Bus transport built to target both .NET Framework and .NET Core. All new projects should use the new Azure Service Bus transport.

Endpoints running on different transports cannot exchange messages and require additional integration work.

Common examples include:

  • A hybrid solution that spans across endpoints deployed on-premises and in a cloud environment.
  • Departments within organization integrating their systems that use different messaging technologies for historical reasons.

Traditionally, such integrations would require native messaging or relaying. Bridging is an alternative, allowing endpoints to communicate over different transports without a need to get into low-level messaging technology code. With time, when endpoints can standardize on a single transport, bridging can be removed with a minimal impact on the entire system.


An environment variable named AzureServiceBus.ConnectionString with the connection string for the Azure Service Bus namespace.

Azure Service Bus Transport

This sample uses the Azure Service Bus Transport (Legacy).

Code walk-through

This sample shows an integration between two endpoints running on two different transports, MsmqEndpoint endpoint running on MSMQ and AsbEndpoint running on Azure Service Bus.

Covered scenarios are:

  • Sending commands from Azure Service Bus endpoint to MSMQ endpoint.
  • Publishing events from MSMQ endpoint and subscribing to those events from Azure Service Bus endpoint.


Endpoints are bridged using Transport Bridge. Bridge project is implemented as a standalone process that runs side-by-side with the bridged endpoints, MsmqEndpoint and AsbEndpoint.

Azure Service Bus endpoint configuration

In this example Azure Service Bus transport is configured to use the EndpointOrientedTopology (to learn more check the topologies documentation). This topology requires some additional steps to be properly bridged.

topology.RegisterPublisher(typeof(MyEvent), "Bridge-ASB");

Azure Service Bus endpoint is bridged via Bridge-ASB queue:

var routing = transport.Routing();
var bridge = routing.ConnectToBridge("Bridge-ASB");

Azure Service Bus topology

The routing of commands to the MSMQ endpoint is specified using bridge extension method:

bridge.RouteToEndpoint(typeof(MyCommand), "Samples.Azure.ServiceBus.MsmqEndpoint");
to access bridge extension method, project has to reference NServiceBus.Bridge.Connector NuGet package.

To subscribe to an event published by MSMQ endpoint, Azure Service Bus endpoint must register publishing endpoint using bridge extension method:

bridge.RegisterPublisher(typeof(MyEvent), "Samples.Azure.ServiceBus.MsmqEndpoint");

MSMQ endpoint configuration

MSMQ endpoint is bridged via Bridge-MSMQ queue:

MSMQ topology

Bridge configuration

Bridge process is connecting between MSMQ and Azure ServiceBus transports and provide any configuration settings required by any of the transports. For Azure Service Bus that would be a mandatory connection string and topology.

var bridgeConfiguration = Bridge
    .And<AzureServiceBusTransport>("Bridge-ASB", transport =>
        //Prevents ASB from using TransactionScope

        var settings = transport.GetSettings();
        var serializer = Tuple.Create(new NewtonsoftSerializer() as SerializationDefinition, new SettingsHolder());
        settings.Set("MainSerializer", serializer);

        var topology = transport.UseEndpointOrientedTopology();
        topology.RegisterPublisher(typeof(OtherEvent), "Samples.Azure.ServiceBus.AsbEndpoint");

bridgeConfiguration.UseSubscriptionPersistence(new InMemorySubscriptionStorage());

In addition the general configuration of the transport, the EndpointOrientedTopology has its own requirements. The first is that all events published on the Azure Service Bus side of the bridge need to be assigned endpoints that publish them. The second is the configuration of a resubscriber

var resubscriber = await Resubscriber<MsmqTransport>.Create(
    inputQueueName: "Bridge-MSMQ",
    delay: TimeSpan.FromSeconds(10),
    configureTransport: t => { });


The resubscriber replays periodically the subscription messages coming from the MSMQ side of the bridge to ensure that the Azure Service Bus topic notifiers have been started.

A bridge is created, started, and should be executed as long as bridging is required.

This sample use a simple InMemorySubscriptionStorage. In production SqlSubscriptionStorage (included in the Bridge package) or custom persistent subscription storage should be used to prevent message loss.
var bridge = bridgeConfiguration.Create();

await bridge.Start().ConfigureAwait(false);
await resubscriber.Start().ConfigureAwait(false);

Console.WriteLine("Press any key to exit");

await resubscriber.Stop().ConfigureAwait(false);
await bridge.Stop().ConfigureAwait(false);

Related Articles

Last modified