Bien Le
Bien Le  -  DXP
Aug 31, 2020
  5767
(1 votes)

Adding Web Job to an existing CMS Web App

This article will show you how to add a WebJob to an existing CMS web app project. The WebJob will access the CMS database and print out the last 15 activity log entries.

First, add a new project to the solution which has the existing CMS web app and choose Azure WebJob template.

Once the project is created, replace the Function.cs file with the content below:
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Threading.Tasks;
 
namespace GetLatestActivityLogs
{
    public class Functions
    {
        public static async Task GetLatestActivityLogs(TextWriter log)
        {
            log.WriteLine($"+++ Getting the latest activity logs +++");
 
            using (var dbConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["EPiServerDB"].ConnectionString))
            {
                await dbConnection.OpenAsync().ConfigureAwait(false);
                var selectCommandText = "select top 15 AL.LogData, AL.ChangeDate, AL.ChangedBy from tblActivityLog as AL order by AL.ChangeDate desc";
                using (var command = new SqlCommand(selectCommandText, dbConnection))
                {
                    using (var reader = await command.ExecuteReaderAsync(CommandBehavior.CloseConnection).ConfigureAwait(false))
                    {
                        while (reader.Read())
                        {
                            log.WriteLine($"Data :{reader["LogData"]} - Changed on: {reader["ChangeDate"]} - Changed by: {reader["ChangedBy"]}");
                        }
                    }
                }
            }
        }
    }
}
And replace the Program.cs file with this content:
using System;
using System.Threading.Tasks;
 
namespace GetLatestActivityLogs
{
    // To learn more about Microsoft Azure WebJobs SDK, please see https://go.microsoft.com/fwlink/?LinkID=320976
    class Program
    {
        // Please set the following connection strings in app.config for this WebJob to run:
        // AzureWebJobsDashboard and AzureWebJobsStorage
        static void Main()
        {
            Task.Run(async () =>
            {
                await Functions.GetLatestActivityLogs(Console.Out).ConfigureAwait(false);
            }).GetAwaiter().GetResult();
        }
    }
}

Then add database connection string to the App.config file

<add name="EPiServerDB"
         connectionString="Server=tcp:{dxp_environment_name}.database.windows.net,1433;Initial Catalog=epicms;Persist Security Info=False;User ID={db_user_id};Password={db_password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
         providerName="System.Data.SqlClient" />

The WebJob project is now ready to add to be deloyed along with the Web App, to do that let's add the project as Azure WebJob to the WebApp

imagebkyx.png

A file named webjobs-list.json added to the web app project

{
  "$schema": "http://schemastore.org/schemas/json/webjobs-list.json",
  "WebJobs": [
    {
      "filePath": "../GetLatestActivityLogs/GetLatestActivityLogs.csproj"
    }
  ]
}

In which the filePath points to path of the WebJob project. And a file added to the project itself, webjob-publish-settings.json, in which defines WebJob name and run mode.

{
  "$schema": "http://schemastore.org/schemas/json/webjob-publish-settings.json",
  "webJobName": "GetLatestActivityLogs",
  "runMode": "Continuous"
}

The solution is now ready publish to DXP environment. Select the web app project and choose publish, and then choose [Azure App Service (Windows)] to deploy the site to:

Uncheck the option [Exclude files from the App_Data folder], and then publish the web app as usual.

Once publish has finished, go to App Service Editor tool in Azure Portal. You can see the Web Jobs and its dependencies are in [app_data] folder.

Run the WebJob and you can check Logs to see the result, it should look like this:

Aug 31, 2020

Comments

Please login to comment.
Latest blogs
Meet the latest OMVPs - H1 2026 Cohort

Meet the Latest Cohort of Optimizely Most Valuable Professionals (OMVPs) Every year, the Optimizely Most Valuable Professional (OMVP) program...

Satata Satez | Mar 13, 2026

Optimizely Commerce vs Composable Commerce: What Should You Do with CMS 13?

As organizations modernize their digital experience platforms, a common architectural question emerges: Should we continue using Optimizely Commerc...

Aniket | Mar 12, 2026

Missing Properties tool for Optimizely CMS

If you have been working with Optimizely CMS for a while you have probably accumulated some technical debt in your property definitions. When you...

Per Nergård (MVP) | Mar 10, 2026

AI Generated Optimizely Developer Newsletter

Updates in the Optimizely ecosystem are everywhere: blog posts, forums, release notes, NuGet packages, and documentation changes. This newsletter...

Allan Thraen | Mar 10, 2026 |