Azure WebJobs or how to migrate Windows Service to Azure

Some time ago I solved problem how to migrate solution consisting from ASP.NET MVC website, Microsoft SQL Server DB and Windows Service to Microsoft Azure.


Udemy course: Migrate Windows service to Azure

Migration of website and DB is straightforward, but migration of Windows Service can be realized different ways. Purpose of Windows Service was act as runtime for execution of scheduled jobs using Timer, which run every 60 seconds to execute scheduled jobs as can be seen in source code:

public partial class JobSchedulerService : System.ServiceProcess.ServiceBase
{
    private Timer timer;

    protected override void OnStart(string[] args)
    {
        timer = new Timer();
        timer.Elapsed += OnTimer;
        timer.Interval = 60 * 1000;  // 60 seconds
        timer.AutoReset = false;
        timer.Start();
    }

    protected override void OnStop()
    {
        timer.Stop();
    }

    private void OnTimer(object sender, ElapsedEventArgs e)
    {
        JobExecutor.ExecuteScheduledJobs();
    }
}

JobSchedulerService execute JobExecutor.ExecuteScheduledJobs() method every 60 seconds. I found 3 options how to migrate this component into Azure infrastructure:

1. Azure Virtual Machine

Pros

  • No code changes in Windows Service required
  • The same deployment method as at on premise solution

Cons

  • Price of Azure VM

2. Azure Cloud Service

Pros

  • Scalability

Cons

  • Price of Azure Cloud Service
  • Complex code changes required

3. Azure WebJob

Pros

  • No price of Azure WebJob because it is part od Azure App Service

Cons

  • Minimal code changes required

Due to cost I decided for Azure WebJob. Transformation of Windows Service to Azure WebJob is simple. I created Azure WebJob project with the following implementation of Program and Function classes:

public class Program
{
    static void Main()
    {
        var host = new JobHost();
        host.Call(typeof(Functions).GetMethod("ExecuteJobs"));
    } 
}

public class Functions
{
    [NoAutomaticTrigger]
    public static void ExecuteJobs()
    {
        JobExecutor.ExecuteScheduledJobs();
    } 
}

Then I created ZIP package from build output and uploaded it to Azure Portal with WebJob type Triggered and CRON schedule “0 * * * * *” to execute every 60 seconds.

If you are interested about more detailed step by step instructions, take my Udemy course Migrate Windows service to Azure. This course describes all aspects of migration Windows service to Azure and help you to find and implement cost effective solution, which help you to save the money in future.