Sample: Azure aware custom plug-in

Applies to Dynamics 365 (online), version 9.x

This is a sample custom plug-in that can post the pipeline execution context to the Azure Service Bus.

This sample code is for Dynamics 365 (online) Customer Engagement. Download the sample: Work with Microsoft Dynamics 365 and Azure Integration


Internet connection is required to download the sample project and to restore the NuGet packages used in the sample project.


For more information about the requirements for running the sample code provided here, see Use the sample and helper code.


The plug-in demonstrates how to obtain the execution context and the tracing service from the service provider parameter of the Execute method. The plug-in then posts the context to the Azure Service Bus endpoint and writes information to the trace log to facilitate debugging.


using System;
using System.Diagnostics;
using System.Threading;
using System.Runtime.Serialization;

using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;

using Microsoft.Xrm.Sdk;

namespace Microsoft.Crm.Sdk.Samples
    /// <summary>
    /// A custom plug-in that can post the execution context of the current message to the Windows
    /// Azure Service Bus. The plug-in also demonstrates tracing which assist with
    /// debugging for plug-ins that are registered in the sandbox.
    /// </summary>
    /// <remarks>This sample requires that a service endpoint be created first, and its ID passed
    /// to the plug-in constructor through the unsecure configuration parameter when the plug-in
    /// step is registered.</remarks>
    public sealed class SandboxPlugin : IPlugin
        private Guid serviceEndpointId; 

        /// <summary>
        /// Constructor.
        /// </summary>
        public SandboxPlugin(string config)
            if (String.IsNullOrEmpty(config) || !Guid.TryParse(config, out serviceEndpointId))
                throw new InvalidPluginExecutionException("Service endpoint ID should be passed as config.");

        public void Execute(IServiceProvider serviceProvider)
            // Retrieve the execution context.
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

            // Extract the tracing service.
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            if (tracingService == null)
                throw new InvalidPluginExecutionException("Failed to retrieve the tracing service.");

            IServiceEndpointNotificationService cloudService = (IServiceEndpointNotificationService)serviceProvider.GetService(typeof(IServiceEndpointNotificationService));
            if (cloudService == null)
                throw new InvalidPluginExecutionException("Failed to retrieve the service bus service.");

                tracingService.Trace("Posting the execution context.");
                string response = cloudService.Execute(new EntityReference("serviceendpoint", serviceEndpointId), context);
                if (!String.IsNullOrEmpty(response))
                    tracingService.Trace("Response = {0}", response);
            catch (Exception e)
                tracingService.Trace("Exception: {0}", e.ToString());

See also

Sample Code for Dynamics 365 and Microsoft Azure Integration
Sample: Azure Aware Custom Workflow Activity
Write a Plug-in