Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more

Ronil Rangaiya
Jun 29, 2023
  38
(0 votes)

Enabling Cloud Support for CMS 12 - a look under the hood

In this post I'll explore configuration of Azure resources for self managed (non-DXP) deployments.

For DXP deployments, the recommended way is to use the EPiServer.CloudPlatform.Cms package and simply add the following line

if (!_webHostingEnvironment.IsDevelopment())
{
       //For DXP deployments
       services.AddCmsCloudPlatformSupport(_configuration);
}

What about Azure deployments?

Recently I was setting up a CMS 12 solution to deploy to my Azure instance for R&D. I used the AddCmsCloudPlatformSupport method to see if it worked - to my surprise it did and I couldn't see any issues during my preliminary tests. However I wanted to understand what exactly this method does and if there are any reasons not to use it for non-DXP usage, so I set out to decompile the CloudPlatform assembly and this is what I found out.

AddCmsCloudPlatformSupport Deconstructed

List of services currently configured by this method:

services.AddApplicationInsights();
services.AddAzureBlobProvider();
services.TryAddEnumerable(ServiceDescriptor.Singleton<IPostConfigureOptions<BlobProvidersOptions>, ValidateAzureBlobProviderOptionsConfigurer>());
services.AddCloudPlatformHealthCheck();
services.AddAzureEventProvider();
services.TryAddEnumerable(ServiceDescriptor.Singleton<IPostConfigureOptions<EventProviderOptions>, ValidateAzureEventProviderOptionsConfigurer>());
services.ConfigureDatabase();
services.ConfigureClientGeolocationOptions();
services.AddDataProtectionToBlobStorage(configuration);
services.ConfigureTelemetryOptions();
services.AddCloudPlatformForwardedFor();

Digging deeper into each method, I was able to uncover its purpose.

AddApplicationInsights

Configures Application Insights and registers the client JavaScript SDK for real user monitoring.

AddAzureBlobProvider

This is an extension method available in EPiServer.Azure to add the AzureBlobProvider. 

public static IServiceCollection AddAzureBlobProvider(
      this IServiceCollection services,
      Action<AzureBlobProviderOptions> configureOptions = null)
    {
      services.Configure<BlobProvidersOptions>((Action<BlobProvidersOptions>) (options =>
      {
        options.DefaultProvider = "azure";
        options.AddProvider<AzureBlobProvider>("azure");
      }));
      if (configureOptions != null)
        services.Configure<AzureBlobProviderOptions>(configureOptions);
      services.TryAddEnumerable(ServiceDescriptor.Singleton<IPostConfigureOptions<AzureBlobProviderOptions>, AzureBlobProviderOptionsConfigurer>());
      return services;
    }

By default this is configured to use the EPiServerAzureBlobs connection string (if specified) in environment configuration and creates a container name "mysitemedia".

AddCloudPlatformHealthCheck

Registers the CMS health and warmup health checks. Refer to this blog for more details and how to add custom health checks.

AddAzureEventProvider

Similar to the AddAzureBlobProvider method, this is an extension method available in EPiServer.Azure to add the AzureEventProvider and by default uses the EPiServerAzureEvents connection string (if specified) in environment configuration and creates a topic named "mysiteevents".

ConfigureDatabase

Sets updateDatabaseSchema to true to apply automatic database updates.

ConfigureClientGeolocationOptions

Sets the request header names to use for user personalisation - EPiServer.Personalisation.ClientGeolocationOptions

options.IPAddressHeader = "X-Forwarded-For";
options.LocationHeader = "CF-IPCountry";

AddDataProtectionToBlobStorage

Extension method in EPiServer.CloudPlatform.Cms to add data protection for BLOB storage using Azure Key Vault.

ConfigureTelemetryOptions

Enables sending user telemetry diagnostics to Optimizely.

AddCloudPlatformForwardedFor

Enables and configures the Forwarded Header Middleware for CDN and load balancer scenarios.

What I ended up with

With this knowledge, I realised not all configured services were relevant to my scenario so my configuration now looks like:

 //Configuration for self-hosted Azure deployments
services.AddApplicationInsightsTelemetry();
services.AddServiceProfiler();
services.AddAzureBlobProvider(options => options.ContainerName = "mosey-media");
services.AddAzureEventProvider(options => options.TopicName = "mosey-events");
services.Configure((Action<DataAccessOptions>)(options => options.UpdateDatabaseSchema = true));

Note, my use case is for R&D purposes so the above is a starting point and a real-world implementation of non-DXP deployment will likely require additional configuration.

To Summarise

AddCmsCloudPlatformSupport is specifically used for the configuration of services for DXP. While it looks like you can also use it for non-DXP deployments, configuring services directly is the way to go to gain more control of your cloud configuration options (and avoid potential breaking changes from future updates to the EPiServer.CloudPlatform.Cms package).

I hope this post helps to provide the context and direction for enabling cloud support for your Azure deployments. 

Jun 29, 2023

Comments

Please login to comment.
Latest blogs
Optimizely Configured Commerce and Spire CMS - Figuring out Handlers

I recently entered the world of Optimizely Configured Commerce and Spire CMS. Intriguing, interesting and challenging at the same time, especially...

Ritu Madan | Mar 12, 2025

Another console app for calling the Optimizely CMS REST API

Introducing a Spectre.Console.Cli app for exploring an Optimizely SaaS CMS instance and to source code control definitions.

Johan Kronberg | Mar 11, 2025 |

Extending UrlResolver to Generate Lowercase Links in Optimizely CMS 12

When working with Optimizely CMS 12, URL consistency is crucial for SEO and usability. By default, Optimizely does not enforce lowercase URLs, whic...

Santiago Morla | Mar 7, 2025 |

Optimizing Experiences with Optimizely: Custom Audience Criteria for Mobile Visitors

In today’s mobile-first world, delivering personalized experiences to visitors using mobile devices is crucial for maximizing engagement and...

Nenad Nicevski | Mar 5, 2025 |

Unable to view Optimizely Forms submissions when some values are too long

I discovered a form where the form submissions could not be viewed in the Optimizely UI, only downloaded. Learn how to fix the issue.

Tomas Hensrud Gulla | Mar 4, 2025 |

CMS 12 DXP Migrations - Time Zones

When it comes to migrating a project from CMS 11 and .NET Framework on the DXP to CMS 12 and .NET Core one thing you need to be aware of is the...

Scott Reed | Mar 4, 2025