Take the community feedback survey now.

Ronil Rangaiya
Jul 13, 2023
  80
(0 votes)

Tips for Deploying to Azure Web App

In this post, I will share my experience in deploying a CMS 12 solution to a self-managed Azure Web App. Although the official documentation provides a good starting point, I wanted to share some tips and potential pitfalls.

For this blog, I'll assume you already have a CMS 12 solution ready for deployment.

1. Easily create Web App + Database

You can use the "Web App + Database" resource create blade from the MarketPlace which simplifies the creation of the web app and SQL database resources. This flow will automatically create a secure connection between the web app and the database and ensures best practices for secure database access. The database username and password will be automatically generated and the connection string added to the web app configuration. You can choose to update the database settings later if needed.

💡 After creation, remember to update the automatically added connection string name on the web app configuration to EPiServerDB and add MultipleActiveResultSets=True.

2. Choose the correct Service Bus tier

The CMS event system requires Topics so you need to choose the "Standard" pricing tier at a minimum. If you choose the Basic tier (as I did), you'll get the following exception on startup:

3. Cloud Configuration

There are two ways of configuring the Azure resources

Configure via Code

For DXP deployments, you can simply add the AddCmsCloudPlatformSupport method however for self-hosted Azure deployments you will need to configure using EPiServer.Azure package directly. See this post for more on code configuration options.

services.AddAzureBlobProvider(options => options.ContainerName = "mosey-media");
services.AddAzureEventProvider(options => options.TopicName = "mosey-events");

💡 Add the EPiServerAzureBlobs and EPiServerAzureEvents connection strings on the web app configuration, which will be used by default.

Configure via appsettings file

In my opinion, code configuration is cleaner and provides more control however you can also configure via the appsettings.json as per the Optimizely documentation. When doing this do note that the "ConnectionString" attribute for AzureBlobProvider and AzureEventProvider is for the actual connection string and not the connection string name.

4. Search Configuration

To configure Search and Navigation, add the following application settings to the web app configuration

episerver__Find__DefaultIndex

episerver__Find__ServiceUrl

💡 Note the double underscore in the key name to ensure it gets translated into an environment variable.

5. Create Admin User

To register an Admin user, add the following line to your Startup.cs. This will register a startup middleware to redirect to the Register page on the first request to the environment.

services.AddAdminUserRegistration();

💡 If you created your site from the Alloy or CMS Empty site template then this line is already added.

6. HTTPS Certificate Error

If the site fails to load and you see "BackgroundService failed" and/or "Unable to configure HTTPS endpoint" exceptions in your log stream, check your "urls" appsetting and remove any https url.

"urls": "http://*:8080/"

I was getting this exception when using the default domain <site>.azurewebsites.net

Jul 13, 2023

Comments

Please login to comment.
Latest blogs
A day in the life of an Optimizely OMVP - Opticon London 2025

This installment of a day in the life of an Optimizely OMVP gives an in-depth coverage of my trip down to London to attend Opticon London 2025 held...

Graham Carr | Oct 2, 2025

Optimizely Web Experimentation Using Real-Time Segments: A Step-by-Step Guide

  Introduction Personalization has become de facto standard for any digital channel to improve the user's engagement KPI’s.  Personalization uses...

Ratish | Oct 1, 2025 |

Trigger DXP Warmup Locally to Catch Bugs & Performance Issues Early

Here’s our documentation on warmup in DXP : 🔗 https://docs.developers.optimizely.com/digital-experience-platform/docs/warming-up-sites What I didn...

dada | Sep 29, 2025

Creating Opal Tools for Stott Robots Handler

This summer, the Netcel Development team and I took part in Optimizely’s Opal Hackathon. The challenge from Optimizely was to extend Opal’s abiliti...

Mark Stott | Sep 28, 2025

Integrating Commerce Search v3 (Vertex AI) with Optimizely Configured Commerce

Introduction This blog provides a technical guide for integrating Commerce Search v3, which leverages Google Cloud's Vertex AI Search, into an...

Vaibhav | Sep 27, 2025

A day in the life of an Optimizely MVP - Opti Graph Extensions add-on v1.0.0 released

I am pleased to announce that the official v1.0.0 of the Opti Graph Extensions add-on has now been released and is generally available. Refer to my...

Graham Carr | Sep 25, 2025