Skip to main content

Dynamic update of Azure Web Job time schedule

The topic of this post is simple:
How can I specify to an Azure Web Job the schedule using application configuration or another location?
Does the web job restart automatically in the moment when I change the time interval?

I decided to write about this, because even if you can find the solution on the internet, you need to invest some time on searching until you find the right documentation related to it (INameResolver).

Short version
A custom INameResolver is defined that based on a key name can read the configuration from any location. In the above example, the value is read from configuration file. Don’t forget to register the name resolver on JobHostConfiguration.
namespace WebJob.Schedule
  class Program
    static void Main(string[] args)
      JobHostConfiguration config = new JobHostConfiguration();
      config.NameResolver = new MagicResolver();

      JobHost host = new JobHost(config);

    private class MagicResolver : INameResolver
      public string Resolve(string name)
        string value = ConfigurationManager.AppSettings["MagicSchedule"];              
  public class Magic
    public static void ScheduleTimeTrigger([TimerTrigger("%MagicSchedule%")] TimerInfo timer)
      // Your magic web job task here

Well done!

More details
We should be aware that each time when the configuration file is change, the entire web application where web job also runs is restarted. This happens because the web job runs in the same application pool with your web application. Changing the application configuration file (web.config) usually triggers a restart of the web application. Be aware of this especially if you plan to update how often the web job runs.

How Azure Web Jobs does run?
When you deploy an Azure Web Job, the system creates automatically a temporary folder where all content related to web job is copied. This is necessary to avoid locking files and resources in the moment when web job runs (you also have a web application that runs in parallel). During the copy action, the configuration files are also copied to the temporary folder.
As for other configuration files in a web application, Azure will monitor the configuration file of web jobs that are in the temp folder. In the moment when you modify it, Azure will detect this action and restart the web job – that will automatically read the new configuration also.


Popular posts from this blog

ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded

Today blog post will be started with the following error when running DB tests on the CI machine:
threw exception: System.InvalidOperationException: The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See for more information. at System.Data.Entity.Infrastructure.DependencyResolution.ProviderServicesFactory.GetInstance(String providerTypeName, String providerInvariantName) This error happened only on the Continuous Integration machine. On the devs machines, everything has fine. The classic problem – on my machine it’s working. The CI has the following configuration:

TeamCity.NET 4.51EF 6.0.2VS2013
It seems that there …

GET call of REST API that contains '/'-slash character in the value of a parameter

Let’s assume that we have the following scenario: I have a public HTTP endpoint and I need to post some content using GET command. One of the parameters contains special characters like “\” and “/”. If the endpoint is an ApiController than you may have problems if you encode the parameter using the http encoder.
using (var httpClient = new HttpClient()) { httpClient.BaseAddress = baseUrl; Task<HttpResponseMessage> response = httpClient.GetAsync(string.Format("api/foo/{0}", "qwert/qwerqwer"))); response.Wait(); response.Result.EnsureSuccessStatusCode(); } One possible solution would be to encode the query parameter using UrlTokenEncode method of HttpServerUtility class and GetBytes method ofUTF8. In this way you would get the array of bytes of the parameter and encode them as a url token.
The following code show to you how you could write the encode and decode methods.

Entity Framework (EF) TransactionScope vs Database.BeginTransaction

In today blog post we will talk a little about a new feature that is available on EF6+ related to Transactions.
Until now, when we had to use transaction we used ‘TransactionScope’. It works great and I would say that is something that is now in our blood.
using (var scope = new TransactionScope(TransactionScopeOption.Required)) { using (SqlConnection conn = new SqlConnection("...")) { conn.Open(); SqlCommand sqlCommand = new SqlCommand(); sqlCommand.Connection = conn; sqlCommand.CommandText = ... sqlCommand.ExecuteNonQuery(); ... } scope.Complete(); } Starting with EF6.0 we have a new way to work with transactions. The new approach is based on Database.BeginTransaction(), Database.Rollback(), Database.Commit(). Yes, no more TransactionScope.
In the followi…