{
    "componentChunkName": "component---src-templates-blog-post-js",
    "path": "/2020/02/02/centralized-configuration-management-using-azure-app-configuration-setting-up-dynamic-refresh-for-configuration-values/",
    "result": {"data":{"site":{"siteMetadata":{"title":"K2V Academy"}},"markdownRemark":{"id":"563bd513-1dfd-54da-af84-525dc9ae0fe9","fields":{"slug":"/2020/02/02/centralized-configuration-management-using-azure-app-configuration-setting-up-dynamic-refresh-for-configuration-values/","readingTime":{"text":"5 min read"}},"html":"<h3>Centralized Configuration Management using Azure App Configuration Series</h3>\n<ul>\n<li><a href=\"https://k2vacademy.com/2019/10/centralized-configuration-management-for-the-cloud-with-azure-app-configuration/\" target=\"_blank\" rel=\"noreferrer\">Introduction</a></li>\n<li><a href=\"https://k2vacademy.com/2020/01/centralized-configuration-management-using-azure-app-configuration-using-managed-identities-to-access-azure-app-configuration/\" target=\"_blank\" rel=\"noreferrer\">Using Managed Identities to Access Azure App Configuration</a></li>\n<li>Setting Up Dynamic Refresh for Configuration Values (This Article)</li>\n<li><a href=\"https://k2vacademy.com/2020/02/centralized-configuration-management-using-azure-app-configuration-setting-up-offline-caching/\" target=\"_blank\" rel=\"noreferrer\">Setting Up Offline Caching</a></li>\n<li><a href=\"https://k2vacademy.com/2020/02/centralized-configuration-management-using-azure-app-configuration-implementing-custom-offline-cache/\" target=\"_blank\" rel=\"noreferrer\">Implementing Custom Offline Cache</a></li>\n<li><a href=\"https://k2vacademy.com/2020/02/centralized-configuration-management-using-azure-app-configuration-using-azure-key-vault-side-by-side/\" target=\"_blank\" rel=\"noreferrer\">Using Azure Key Vault Side-by-Side</a></li>\n<li><a href=\"https://k2vacademy.com/2020/02/centralized-configuration-management-using-azure-app-configuration-local-debugging-when-using-managed-identities-to-access-azure-app-configuration/\" target=\"_blank\" rel=\"noreferrer\">Local Debugging When Using Managed Identities to Access Azure App Configuration</a></li>\n</ul>\n<p>In the previous article we looked at how we can use <a href=\"https://k2vacademy.com/2020/01/centralized-configuration-management-using-azure-app-configuration-using-managed-identities-to-access-azure-app-configuration/\" target=\"_blank\" rel=\"noreferrer\">Managed Identities to Access Azure App Configuration</a>. In this article we will build on that knowledge. We got the same Music Store application we used previously, and we can setup the application to load configurations dynamically for your application. Configuring this is very easy. All you need to do is configure dynamic refresh in your <strong>Program.cs</strong> file in the <strong><code>ConfigureAppConfiguration()</code></strong> method.</p>\n<p>In <strong><code>AzureAppConfigurationOption</code></strong> there is a method called <strong><code>ConfigureRefresh()</code></strong> which we need to use to configure dynamic refresh. See the following sample code.</p>\n<!-- `gist:kasunkv/e485a9ec42a67954da00df5b17736f8d#Program.cs` -->\n<div class=\"gatsby-highlight\" data-language=\"cs\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-cs line-numbers\"><code class=\"language-cs\"><span class=\"token keyword\">using</span> <span class=\"token namespace\">Azure<span class=\"token punctuation\">.</span>Identity</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">Microsoft<span class=\"token punctuation\">.</span>Extensions<span class=\"token punctuation\">.</span>Configuration<span class=\"token punctuation\">.</span>AzureAppConfiguration</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">namespace</span> <span class=\"token namespace\">MusicStore<span class=\"token punctuation\">.</span>Web</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Program</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token range operator\">..</span><span class=\"token punctuation\">.</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">IHostBuilder</span> <span class=\"token function\">CreateHostBuilder</span><span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token keyword\">string</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span> args<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n      Host<span class=\"token punctuation\">.</span><span class=\"token function\">CreateDefaultBuilder</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">ConfigureWebHostDefaults</span><span class=\"token punctuation\">(</span>webBuilder <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n          webBuilder<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">UseStartup</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>Startup<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">ConfigureAppConfiguration</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>context<span class=\"token punctuation\">,</span> config<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n          <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> settings <span class=\"token operator\">=</span> config<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> appConfigEndpoint <span class=\"token operator\">=</span> settings<span class=\"token punctuation\">[</span><span class=\"token string\">\"AppSettings:AppConfiguration:Endpoint\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n          <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> userAssignedIdentityClientId <span class=\"token operator\">=</span> settings<span class=\"token punctuation\">[</span><span class=\"token string\">\"AppSettings:Identity:ClientId\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n          <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">string</span><span class=\"token punctuation\">.</span><span class=\"token function\">IsNullOrEmpty</span><span class=\"token punctuation\">(</span>appConfigEndpoint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">{</span>\n            <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> endpoint <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">Uri</span><span class=\"token punctuation\">(</span>appConfigEndpoint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n            config<span class=\"token punctuation\">.</span><span class=\"token function\">AddAzureAppConfiguration</span><span class=\"token punctuation\">(</span>options <span class=\"token operator\">=></span>\n            <span class=\"token punctuation\">{</span>\n              options\n                <span class=\"token punctuation\">.</span><span class=\"token function\">Connect</span><span class=\"token punctuation\">(</span>endpoint<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">ManagedIdentityCredential</span><span class=\"token punctuation\">(</span><span class=\"token named-parameter punctuation\">clientId</span><span class=\"token punctuation\">:</span> userAssignedIdentityClientId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n                <span class=\"token comment\">// Setting up dynamic app configuration</span>\n                <span class=\"token punctuation\">.</span><span class=\"token function\">ConfigureRefresh</span><span class=\"token punctuation\">(</span>refreshOpt <span class=\"token operator\">=></span>\n                <span class=\"token punctuation\">{</span>\n                  refreshOpt<span class=\"token punctuation\">.</span><span class=\"token function\">Register</span><span class=\"token punctuation\">(</span><span class=\"token named-parameter punctuation\">key</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"AppSettings:Version\"</span><span class=\"token punctuation\">,</span> <span class=\"token named-parameter punctuation\">refreshAll</span><span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span> <span class=\"token named-parameter punctuation\">label</span><span class=\"token punctuation\">:</span> LabelFilter<span class=\"token punctuation\">.</span>Null<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n                <span class=\"token punctuation\">.</span><span class=\"token function\">UseFeatureFlags</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>We can pass in <strong><code>AzureAppConfigurationRefreshOption</code></strong> instance that has <strong><code>Register()</code></strong> method we can use. Here in the <strong><code>Register()</code></strong> method we can supply a <strong><code>key</code></strong>. This key is used as the trigger for the refresh. What you need to do is add this <strong><code>key</code></strong> to the App Configuration instance and then set a value to it. It can be anything. When the value of this <strong><code>key</code></strong> is changed, the App Configuration will trigger a refresh. If the value of this <strong><code>key</code></strong> does not change, regardless if any other app configuration changes, it will not be refreshed.</p>\n<blockquote>\n<p><em>Example, for the Music Store application I’ve set a configuration value <strong><code>AppSettings:Version</code></strong> on the App Configuration instance and set a value of the key to 1.0. Only when I change this version value of 1.0 to something else like 2.0 the app configuration will be updated.</em></p>\n</blockquote>\n<p>The <strong><code>Register()</code></strong> method has 2 more parameters. The parameter <strong><code>refreshAll</code></strong> is a Boolean value where it decides whether all the configuration values need to be refreshed or not. We set this to <strong><code>true</code></strong> in our example. The other parameter is <strong><code>label</code></strong>. This is set to one of the values of a label we define on App Configuration. Labels can be used to have multi-dimensional app configurations. If you are using labels, you can set a value for the label to fetch the correct set of configurations marked with that label. For us, we are not using labels for now, so We can set this to an ASCII Null value. <strong><code>LabelFilter.Null</code></strong> is used for that.</p>\n<p>Last thing we need to do is to set the <strong><code>AppSettings:Version</code></strong> in the Azure App Configuration instance for Music Store.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/d06f24092615718892e206115e6e7e7e/6ca16/1-set-refresh-trigger-value.jpg\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 37.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAIABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAEF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABxYAH/8QAFBABAAAAAAAAAAAAAAAAAAAAEP/aAAgBAQABBQJ//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAEP/aAAgBAQAGPwJ//8QAFxABAQEBAAAAAAAAAAAAAAAAACERUf/aAAgBAQABPyHeoj//2gAMAwEAAgADAAAAEPAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGRAAAwEBAQAAAAAAAAAAAAAAAAERQVGR/9oACAEBAAE/EGklN3GW9Lw/T//Z'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"1 set refresh trigger value\"\n        title=\"1 set refresh trigger value\"\n        src=\"/static/d06f24092615718892e206115e6e7e7e/4b190/1-set-refresh-trigger-value.jpg\"\n        srcset=\"/static/d06f24092615718892e206115e6e7e7e/e07e9/1-set-refresh-trigger-value.jpg 200w,\n/static/d06f24092615718892e206115e6e7e7e/066f9/1-set-refresh-trigger-value.jpg 400w,\n/static/d06f24092615718892e206115e6e7e7e/4b190/1-set-refresh-trigger-value.jpg 800w,\n/static/d06f24092615718892e206115e6e7e7e/e5166/1-set-refresh-trigger-value.jpg 1200w,\n/static/d06f24092615718892e206115e6e7e7e/b17f8/1-set-refresh-trigger-value.jpg 1600w,\n/static/d06f24092615718892e206115e6e7e7e/6ca16/1-set-refresh-trigger-value.jpg 1855w\"\n        sizes=\"(max-width: 800px) 100vw, 800px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n  </a>\n    </span></p>\n<p>Run the application and then change the value of the <strong><code>AppSettings:Discount:Amount</code></strong> to a different value and observe that the app is not updated. And only when you update <strong><code>AppSettings:Version</code></strong> value the configuration is pulled down.</p>\n<blockquote>\n<p><em>Note: You may notice that even if you update the <strong><code>AppSettings:Version</code></strong> value the configuration values are not immediately pulled down. It would take up to 30 seconds to pull down the new configuration values. Let’s look at why.</em></p>\n</blockquote>\n<h3>Setting Cache Expiration Time to Decrease the Time to Update the Configuration Values</h3>\n<p>App Configuration library has a built-in caching mechanism to caches the app settings values for up to 30 seconds by default. That is why you might not see the values updating immediately. But we can configure this cache time and reduced the time taken to update the configuration.</p>\n<p><strong><code>AzureAppConfigurationRefreshOptions</code></strong> class has a method called <strong><code>SetCacheExpiration()</code></strong> that takes a <strong><code>TimeSpan</code></strong> struct where you can use to reduce the default cache expiration time.</p>\n<!-- `gist:kasunkv/da7fb0148e2d0fc9d2d1754d9416b9f3#Program.cs` -->\n<div class=\"gatsby-highlight\" data-language=\"cs\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-cs line-numbers\"><code class=\"language-cs\"><span class=\"token keyword\">using</span> <span class=\"token namespace\">Azure<span class=\"token punctuation\">.</span>Identity</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">Microsoft<span class=\"token punctuation\">.</span>Extensions<span class=\"token punctuation\">.</span>Configuration<span class=\"token punctuation\">.</span>AzureAppConfiguration</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">namespace</span> <span class=\"token namespace\">MusicStore<span class=\"token punctuation\">.</span>Web</span>\n<span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Program</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token range operator\">..</span><span class=\"token punctuation\">.</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token return-type class-name\">IHostBuilder</span> <span class=\"token function\">CreateHostBuilder</span><span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token keyword\">string</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span> args<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span>\n      Host<span class=\"token punctuation\">.</span><span class=\"token function\">CreateDefaultBuilder</span><span class=\"token punctuation\">(</span>args<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">ConfigureWebHostDefaults</span><span class=\"token punctuation\">(</span>webBuilder <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n          webBuilder<span class=\"token punctuation\">.</span><span class=\"token generic-method\"><span class=\"token function\">UseStartup</span><span class=\"token generic class-name\"><span class=\"token punctuation\">&lt;</span>Startup<span class=\"token punctuation\">></span></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">ConfigureAppConfiguration</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span>context<span class=\"token punctuation\">,</span> config<span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n          <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> settings <span class=\"token operator\">=</span> config<span class=\"token punctuation\">.</span><span class=\"token function\">Build</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> appConfigEndpoint <span class=\"token operator\">=</span> settings<span class=\"token punctuation\">[</span><span class=\"token string\">\"AppSettings:AppConfiguration:Endpoint\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n          <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> userAssignedIdentityClientId <span class=\"token operator\">=</span> settings<span class=\"token punctuation\">[</span><span class=\"token string\">\"AppSettings:Identity:ClientId\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n          <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token keyword\">string</span><span class=\"token punctuation\">.</span><span class=\"token function\">IsNullOrEmpty</span><span class=\"token punctuation\">(</span>appConfigEndpoint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">{</span>\n              <span class=\"token class-name\"><span class=\"token keyword\">var</span></span> endpoint <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">Uri</span><span class=\"token punctuation\">(</span>appConfigEndpoint<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n              config<span class=\"token punctuation\">.</span><span class=\"token function\">AddAzureAppConfiguration</span><span class=\"token punctuation\">(</span>options <span class=\"token operator\">=></span>\n              <span class=\"token punctuation\">{</span>\n                options\n                  <span class=\"token punctuation\">.</span><span class=\"token function\">Connect</span><span class=\"token punctuation\">(</span>endpoint<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token constructor-invocation class-name\">ManagedIdentityCredential</span><span class=\"token punctuation\">(</span><span class=\"token named-parameter punctuation\">clientId</span><span class=\"token punctuation\">:</span> userAssignedIdentityClientId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n                  <span class=\"token comment\">// Setting up dynamic app configuration</span>\n                  <span class=\"token punctuation\">.</span><span class=\"token function\">ConfigureRefresh</span><span class=\"token punctuation\">(</span>refreshOpt <span class=\"token operator\">=></span>\n                  <span class=\"token punctuation\">{</span>\n                    refreshOpt<span class=\"token punctuation\">.</span><span class=\"token function\">Register</span><span class=\"token punctuation\">(</span><span class=\"token named-parameter punctuation\">key</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"AppSettings:Version\"</span><span class=\"token punctuation\">,</span> <span class=\"token named-parameter punctuation\">refreshAll</span><span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span> <span class=\"token named-parameter punctuation\">label</span><span class=\"token punctuation\">:</span> LabelFilter<span class=\"token punctuation\">.</span>Null<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n                    <span class=\"token comment\">// Set the cache expiry time to 10 seconds.</span>\n                    refreshOpt<span class=\"token punctuation\">.</span><span class=\"token function\">SetCacheExpiration</span><span class=\"token punctuation\">(</span>TimeSpan<span class=\"token punctuation\">.</span><span class=\"token function\">FromSeconds</span><span class=\"token punctuation\">(</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n                  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n                  <span class=\"token punctuation\">.</span><span class=\"token function\">UseFeatureFlags</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n              <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n          <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>Now if you run the application and change the configuration values and the trigger value on the App Configuration instance, you can see the values are pulled down much quicker than before.</p>\n<h2>Summary</h2>\n<p>In this article we looked at how we can configure dynamic configuration reload for ASP.Net Core application to make the updated configuration values available for the application. The code sample for this article can be found in the <a href=\"https://github.com/kasunkv/azure-app-configuration-dynamic-config-refresh-example\" target=\"_blank\" rel=\"noreferrer\">Azure App Configuration Dynamic Config Refresh Example GitHub repository</a>. In the next article we’ll look at how we can configure Offline Caching for App Configuration.</p>","frontmatter":{"title":"Centralized Configuration Management using Azure App Configuration: Setting Up Dynamic Refresh for Configuration Values","date":"February 02, 2020","originalDate":"2020-02-02","categories":[".Net Core","ASP.Net Core","Azure","App Configuration","Cloud","Development","Microsoft"],"author":{"id":"kasun-kodagoda","name":"Kasun Kodagoda","description":"Kasun Kodagoda is a Senior Technical Lead at 99X working on the Microsoft stack. He is an Azure Cloud and Azure DevOps enthusiasts and contributes to few Open Source projects on GitHub, mainly focusing on Azure Pipelines Extensions. OWASP ZAP Scan, Slack Notification task are some of his popular Azure DevOps extension. Kasun is also a blogger, occasional gamer and creates YouTube videos on Azure, Azure DevOps and Gaming and loves creating Architectural and Interior Design visualizations when he finds time.","profile":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEtUlEQVQ4ywXB+U9aBwAA4PdfbGmypNlhllarVao4kPt+8OA9eJxKRQWlggeoqEWEYvFCi3hwC4hCRaqAnUhhgthj2mt2R5y1y5ol+3F/w74PCG6FQsmNxMZyKRPOl46KJ8+Lx+V8pXJcLp3mkhc/rh/veAsR7242Hk6uj42OGA0GywPLesIXjK4Ang2/wzkbcowXoq78UfGgVH5WPnpaONwOBTJBZyHuW3I5Q4/DqVxiPe4bHzcNGQyj98fWYh5/1A3MLy8OGgybQWtsy3vwUyFXOg5vRmVyWX0Dpr7uFggyZ+bntvcf7+xvxp9EbXZLn14/OzuZSvu8oUeAfcYeWrMU912BsDdXyEViESqFePPb6wwcho3H1FZ93dTU5A2tpNLRnb2Iw2HR9nQvzo4WD1a9vllAPzC8Hbb+eboaDC4d5jPaHhVCbtx19JeDzrJvLmnTkxtva3WaTDa6kwrOTlu03erxMeN6YD7ofQj09A64F0f+u1g+PfLkniZkQlZoWH6+MXe2FXgRC5Rd5iERGYI42WwsmfRPTIxo1F0262gk6Ays2gHz2JCqq6uSsXx6tXBaio3qZMF+wTv/5G/J0NtNz7O5IXs7GyI1et3WzY0F42BvX2+3Z8Wx5p5yL0wAq677MkVbZ0ere85Qzoft/RK3lrWkhVe1yGIHT0a+0ycgjMo49wfU2eSU1aw3Dmj24vadiDkVMQMnadPiuHp15t6LffP7sts3LnVpGP0i6nQnsmVS+Uf78/Mji1qJAoWPn+j8j/qMetWvh4O/PNW9TWuARb10y9T2IqZ9nbx3njGVwqY9i+I8aDtaGC4/Gn48oYubOqc1YOddZGFSnvKpWxXyQlRzluyqxNqBuBVJ2KX5tbbfE5JXGz2VbadLB7nVPIeKNyKkm+T8YSG1D23x2aTloDi9JDRqJAcrknJAWPTwgUJmJZtc2016DtPLB6mVnyt7LltvNxMz1Q46NQpbO6rjk2nYGw+MaDrmeF0OnVWS56fJdy8TZydx4NNfHz5evb+8PLu6evP58/uT5/vdahm9/jsFuU5MwTKbbpPu1Ehl8i+vfYUjUFVqzfScI74deXlavLh8A/xzWfr3qvz3RSmXjU7ZhllsVnV1dZsMNQ324hobrl/7YmrGpR+2VddibtbU1dzC4Il0AonK4nCVSjlQ8Cq9k2J9J8yik4kkGvYHMpFEhQTiPz5+jm/vEihM30ZK0dnXTGSR6Fw8kcYEkRYSA0/m1NY3A6pWGI/HUagUHk/A5YvpTIgFwi1ESmIns+aP3mpoHrFMowo1kcajMiAChcMARRQ6F0/h3m5oBoRCAZ8PIyIJIpKDEMriCPjCNhKVY7Y+fPvhgsbkovIOGL3LBEUMECHSuCxITAeFd3C02gYswGAwIVjKFUggYSuMtvH4Ii6soLERdY9+b/+QQGE1YEkMjkggUrIhKZ7MYfFlBBr3Zl0TBtsC0GgMJgdhgiIuLBOKlQiq5PClTJ4EQVvd3hBP2Eqm80FYAYmUNA6KI7IZXDEGS6q6UYfFUwE2KCBS2EQqF4KlMKqEJR2gQM6GpBxIbDJPQWg7hSngIq0svpzCQnBEdhOOVvV9zTdV1Y0/kP8Hsucu/18URfsAAAAASUVORK5CYII="},"images":{"fallback":{"src":"/static/b06d893ba176e32c97ea1f1a58bfff43/b5a32/kasun-kodagoda.png","srcSet":"/static/b06d893ba176e32c97ea1f1a58bfff43/ca121/kasun-kodagoda.png 20w,\n/static/b06d893ba176e32c97ea1f1a58bfff43/b5941/kasun-kodagoda.png 39w,\n/static/b06d893ba176e32c97ea1f1a58bfff43/b5a32/kasun-kodagoda.png 78w,\n/static/b06d893ba176e32c97ea1f1a58bfff43/d8a72/kasun-kodagoda.png 156w","sizes":"(min-width: 78px) 78px, 100vw"},"sources":[{"srcSet":"/static/b06d893ba176e32c97ea1f1a58bfff43/264f2/kasun-kodagoda.webp 20w,\n/static/b06d893ba176e32c97ea1f1a58bfff43/72e27/kasun-kodagoda.webp 39w,\n/static/b06d893ba176e32c97ea1f1a58bfff43/7a63e/kasun-kodagoda.webp 78w,\n/static/b06d893ba176e32c97ea1f1a58bfff43/d1e3d/kasun-kodagoda.webp 156w","type":"image/webp","sizes":"(min-width: 78px) 78px, 100vw"}]},"width":78,"height":78}}},"socials":{"facebook":"https://www.facebook.com/kasun.kodagoda","github":"https://github.com/kasunkv","twitter":"https://twitter.com/kasun_kodagoda","linkedin":"https://www.linkedin.com/in/kasunkodagoda","website":"https://kasunkodagoda.com"}},"description":"Learn how you can configure Dynamics Refresh for Azure App Configuration so you can add the capability to update the app settings on your ASP.Net Core application without the need for the application to restart.","tags":["Azure","App Configuration","Dynamic Refresh","ASP.Net Core","Cloud","Configuration Management","Development","Microsoft"],"image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEEAgP/xAAVAQEBAAAAAAAAAAAAAAAAAAABAP/aAAwDAQACEAMQAAABdFiLgaB//8QAGRAAAgMBAAAAAAAAAAAAAAAAAgMBEBIE/9oACAEBAAEFAn822AuQDNTX/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGRAAAgMBAAAAAAAAAAAAAAAAAREAEiBx/9oACAEBAAY/ArBmANcz/8QAGxAAAwACAwAAAAAAAAAAAAAAAAERITEQQYH/2gAIAQEAAT8hnZDDVEtSHQ06d940Hs//2gAMAwEAAgADAAAAEKcP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFREBAQAAAAAAAAAAAAAAAAAAEEH/2gAIAQIBAT8Qh//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQVFhkf/aAAgBAQABPxBidACAK5V1CbjINldW/b8gHIe4NwFsQnCf/9k="},"images":{"fallback":{"src":"/static/899d5dd2ed4566cf4380a6a4f84e12c4/333cc/featured.jpg","srcSet":"/static/899d5dd2ed4566cf4380a6a4f84e12c4/fd1a3/featured.jpg 300w,\n/static/899d5dd2ed4566cf4380a6a4f84e12c4/c5f00/featured.jpg 600w,\n/static/899d5dd2ed4566cf4380a6a4f84e12c4/333cc/featured.jpg 1200w","sizes":"(min-width: 1200px) 1200px, 100vw"},"sources":[{"srcSet":"/static/899d5dd2ed4566cf4380a6a4f84e12c4/7987b/featured.webp 300w,\n/static/899d5dd2ed4566cf4380a6a4f84e12c4/8a009/featured.webp 600w,\n/static/899d5dd2ed4566cf4380a6a4f84e12c4/c06d5/featured.webp 1200w","type":"image/webp","sizes":"(min-width: 1200px) 1200px, 100vw"}]},"width":1200,"height":576},"resize":{"src":"/static/899d5dd2ed4566cf4380a6a4f84e12c4/47498/featured.jpg","height":576,"width":1200}}}}},"previous":{"fields":{"slug":"/2020/01/29/centralized-configuration-management-using-azure-app-configuration-using-managed-identities-to-access-azure-app-configuration/"},"frontmatter":{"title":"Centralized Configuration Management using Azure App Configuration: Using Managed Identities to Access Azure App Configuration","date":"January 29, 2020","image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABfJy1OQuB/8QAGxAAAgIDAQAAAAAAAAAAAAAAAQIAIgMREzL/2gAIAQEAAQUCV7NrpHNsPogT/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAGhAAAgIDAAAAAAAAAAAAAAAAAAECESAxQf/aAAgBAQAGPwJddE3ho//EABwQAAICAgMAAAAAAAAAAAAAAAEhABEQMVFhkf/aAAgBAQABPyHTksk6EdDe67wSzMZnOE8n/9oADAMBAAIAAwAAABBH/wD/xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPxBH/8QAFREBAQAAAAAAAAAAAAAAAAAAEQD/2gAIAQIBAT8QCb//xAAbEAEAAgMBAQAAAAAAAAAAAAABABEhQVFhMf/aAAgBAQABPxAAUVjdj9v0rHZYKAr0vEzoWFIqNXCGAHGHTnxP/9k="},"images":{"fallback":{"src":"/static/acde36f02fec58bcf80a1e64580fa711/c5f00/featured.jpg","srcSet":"/static/acde36f02fec58bcf80a1e64580fa711/caff5/featured.jpg 150w,\n/static/acde36f02fec58bcf80a1e64580fa711/fd1a3/featured.jpg 300w,\n/static/acde36f02fec58bcf80a1e64580fa711/c5f00/featured.jpg 600w,\n/static/acde36f02fec58bcf80a1e64580fa711/333cc/featured.jpg 1200w","sizes":"(min-width: 600px) 600px, 100vw"},"sources":[{"srcSet":"/static/acde36f02fec58bcf80a1e64580fa711/78240/featured.webp 150w,\n/static/acde36f02fec58bcf80a1e64580fa711/7987b/featured.webp 300w,\n/static/acde36f02fec58bcf80a1e64580fa711/8a009/featured.webp 600w,\n/static/acde36f02fec58bcf80a1e64580fa711/c06d5/featured.webp 1200w","type":"image/webp","sizes":"(min-width: 600px) 600px, 100vw"}]},"width":600,"height":288}}}}},"next":{"fields":{"slug":"/2020/02/02/centralized-configuration-management-using-azure-app-configuration-setting-up-offline-caching/"},"frontmatter":{"title":"Centralized Configuration Management using Azure App Configuration: Setting Up Offline Caching","date":"February 02, 2020","image":{"childImageSharp":{"gatsbyImageData":{"layout":"constrained","placeholder":{"fallback":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAQFAv/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAFmNdm2Imw//8QAHRAAAQIHAAAAAAAAAAAAAAAAAgABAwQQEiExMv/aAAgBAQABBQI4FjUm+Byi3//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABoQAAICAwAAAAAAAAAAAAAAAAEQAAITIUH/2gAIAQEABj8COOvGJtf/xAAbEAEAAwEAAwAAAAAAAAAAAAABABEhQTFRcf/aAAgBAQABPyHFCKHrETEpOMp9RIIus8hr7BTqf//aAAwDAQACAAMAAAAQhB//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAwEBPxBX/8QAFhEBAQEAAAAAAAAAAAAAAAAAAAER/9oACAECAQE/EGR//8QAGxABAAIDAQEAAAAAAAAAAAAAAQAhETGRQXH/2gAIAQEAAT8QLK0lVa+xp0g0PGOdyuQbAtB3UpoTy0AYAHRP/9k="},"images":{"fallback":{"src":"/static/0e5be87f4a702232de79fc1632f0fbe4/c5f00/featured.jpg","srcSet":"/static/0e5be87f4a702232de79fc1632f0fbe4/caff5/featured.jpg 150w,\n/static/0e5be87f4a702232de79fc1632f0fbe4/fd1a3/featured.jpg 300w,\n/static/0e5be87f4a702232de79fc1632f0fbe4/c5f00/featured.jpg 600w,\n/static/0e5be87f4a702232de79fc1632f0fbe4/333cc/featured.jpg 1200w","sizes":"(min-width: 600px) 600px, 100vw"},"sources":[{"srcSet":"/static/0e5be87f4a702232de79fc1632f0fbe4/78240/featured.webp 150w,\n/static/0e5be87f4a702232de79fc1632f0fbe4/7987b/featured.webp 300w,\n/static/0e5be87f4a702232de79fc1632f0fbe4/8a009/featured.webp 600w,\n/static/0e5be87f4a702232de79fc1632f0fbe4/c06d5/featured.webp 1200w","type":"image/webp","sizes":"(min-width: 600px) 600px, 100vw"}]},"width":600,"height":288}}}}},"sidebarData":{"tags":[{"tag":".Net Core","totalCount":13},{"tag":"ARM","totalCount":2},{"tag":"ASP.Net Core","totalCount":17},{"tag":"AVD","totalCount":2},{"tag":"Active Directory","totalCount":7},{"tag":"Android","totalCount":2},{"tag":"Android Emulator","totalCount":1},{"tag":"Angular.JS","totalCount":3},{"tag":"Animation","totalCount":3},{"tag":"Api Management","totalCount":1},{"tag":"App Configuration","totalCount":14},{"tag":"App Service","totalCount":9},{"tag":"Application Insights","totalCount":1},{"tag":"Aurelia","totalCount":7},{"tag":"Automation","totalCount":1},{"tag":"AzSK","totalCount":3},{"tag":"Azure","totalCount":48},{"tag":"Azure Automation","totalCount":1},{"tag":"Azure CLI","totalCount":2},{"tag":"Azure DevOps","totalCount":16},{"tag":"Azure DevOps Extensions","totalCount":2},{"tag":"Azure Functions","totalCount":8},{"tag":"Azure Pipelines","totalCount":2},{"tag":"Azure Policy","totalCount":1},{"tag":"Azure Resource Manager","totalCount":4},{"tag":"Azure Resource Providers","totalCount":1},{"tag":"Azure Security","totalCount":2},{"tag":"Azure Subscription","totalCount":1},{"tag":"Branching Strategy","totalCount":2},{"tag":"Build Tasks","totalCount":1},{"tag":"C#","totalCount":9},{"tag":"CMS","totalCount":1},{"tag":"Certificates","totalCount":1},{"tag":"Chrome","totalCount":1},{"tag":"Cloud","totalCount":24},{"tag":"Cloud Patterns","totalCount":1},{"tag":"Cloud Security","totalCount":2},{"tag":"Code Quality","totalCount":2},{"tag":"Compliance","totalCount":1},{"tag":"Configuration Management","totalCount":2},{"tag":"Continuous Delivery","totalCount":3},{"tag":"Continuous Deployment","totalCount":1},{"tag":"Continuous Integration","totalCount":2},{"tag":"Counter Expressions","totalCount":1},{"tag":"Custom Controls","totalCount":3},{"tag":"Custom Extensions","totalCount":1},{"tag":"DNS","totalCount":1},{"tag":"Debugging","totalCount":1},{"tag":"Dependency Injection","totalCount":4},{"tag":"DevOps","totalCount":23},{"tag":"Development","totalCount":33},{"tag":"Documentation","totalCount":1},{"tag":"Dynamic Refresh","totalCount":1},{"tag":"Emulator","totalCount":3},{"tag":"End-to-End Testing","totalCount":1},{"tag":"Error Tracking","totalCount":1},{"tag":"Extensions","totalCount":2},{"tag":"Feature Flags","totalCount":7},{"tag":"Feature Management","totalCount":13},{"tag":"Federated Identity","totalCount":1},{"tag":"FireFox OS","totalCount":1},{"tag":"Git","totalCount":4},{"tag":"GitFlow","totalCount":2},{"tag":"GitHub","totalCount":3},{"tag":"Google","totalCount":1},{"tag":"Google Maps","totalCount":2},{"tag":"Governance","totalCount":1},{"tag":"HAXM","totalCount":2},{"tag":"Hypervisor","totalCount":1},{"tag":"IaaS","totalCount":1},{"tag":"Implicit Typing","totalCount":1},{"tag":"JSON Templates","totalCount":1},{"tag":"JavaScript","totalCount":11},{"tag":"Joomla","totalCount":1},{"tag":"Key Rotation","totalCount":1},{"tag":"Key Vault","totalCount":8},{"tag":"Late Binding","totalCount":1},{"tag":"Localization","totalCount":1},{"tag":"Managed Identity","totalCount":8},{"tag":"Marketing","totalCount":1},{"tag":"Microsoft","totalCount":16},{"tag":"Monitoring","totalCount":1},{"tag":"NPM","totalCount":1},{"tag":"Networking","totalCount":1},{"tag":"NuGet","totalCount":1},{"tag":"OWASP","totalCount":4},{"tag":"OWASP ZAP","totalCount":4},{"tag":"Offline Cache","totalCount":2},{"tag":"Online Presence","totalCount":1},{"tag":"OpenSSL","totalCount":1},{"tag":"OpenSource","totalCount":1},{"tag":"PHP","totalCount":1},{"tag":"PaaS","totalCount":1},{"tag":"Personal Development","totalCount":1},{"tag":"PhpStorm","totalCount":1},{"tag":"PowerShell","totalCount":3},{"tag":"Premium Hosting","totalCount":1},{"tag":"Protractor","totalCount":1},{"tag":"Pull Requests","totalCount":1},{"tag":"Release Pipeline","totalCount":1},{"tag":"SEO","totalCount":1},{"tag":"SPA","totalCount":8},{"tag":"SQL Server","totalCount":2},{"tag":"Security","totalCount":17},{"tag":"Security Center","totalCount":1},{"tag":"Security Testing","totalCount":4},{"tag":"Sentry","totalCount":1},{"tag":"Serverless","totalCount":6},{"tag":"Service Bus","totalCount":1},{"tag":"Sharpen Your C#","totalCount":3},{"tag":"SonarQube","totalCount":2},{"tag":"Testing","totalCount":6},{"tag":"Tips & Tricks","totalCount":10},{"tag":"Tracking Branches","totalCount":1},{"tag":"USB Disks","totalCount":1},{"tag":"VSTS","totalCount":1},{"tag":"VT-X","totalCount":1},{"tag":"Validation","totalCount":1},{"tag":"Version Control","totalCount":3},{"tag":"Virtual Machines","totalCount":4},{"tag":"Visual Studio","totalCount":6},{"tag":"Visual Studio Code","totalCount":1},{"tag":"Visual Studio Team Services","totalCount":1},{"tag":"Wiki","totalCount":1},{"tag":"Windows","totalCount":1},{"tag":"Windows Phone","totalCount":5},{"tag":"XAML","totalCount":3},{"tag":"XDebug","totalCount":1}],"categories":[{"category":".Net Core","totalCount":20},{"category":"ASP.Net Core","totalCount":21},{"category":"Active Directory","totalCount":8},{"category":"Android","totalCount":2},{"category":"Angular.JS","totalCount":3},{"category":"Animation","totalCount":3},{"category":"Api Management","totalCount":1},{"category":"App Configuration","totalCount":14},{"category":"App Service","totalCount":15},{"category":"Application Insights","totalCount":1},{"category":"Aurelia","totalCount":7},{"category":"AzSK","totalCount":3},{"category":"Azure","totalCount":49},{"category":"Azure CLI","totalCount":3},{"category":"Azure DevOps","totalCount":19},{"category":"Azure DevOps Extensions","totalCount":3},{"category":"Azure Functions","totalCount":7},{"category":"Azure Pipelines","totalCount":2},{"category":"Azure Policy","totalCount":1},{"category":"Azure Resource Manager","totalCount":2},{"category":"Azure Subscription","totalCount":1},{"category":"C#","totalCount":15},{"category":"CMS","totalCount":1},{"category":"Chrome","totalCount":1},{"category":"Cloud","totalCount":41},{"category":"Cloud Patterns","totalCount":1},{"category":"Code Quality","totalCount":3},{"category":"Compliance","totalCount":1},{"category":"Configuration Management","totalCount":2},{"category":"Continuous Delivery","totalCount":6},{"category":"Custom Controls","totalCount":3},{"category":"DNS","totalCount":1},{"category":"Debugging","totalCount":1},{"category":"Dependency Injection","totalCount":4},{"category":"Design Patterns","totalCount":1},{"category":"DevOps","totalCount":29},{"category":"Development","totalCount":77},{"category":"Emulator","totalCount":2},{"category":"End-to-End Testing","totalCount":1},{"category":"Extension Development","totalCount":1},{"category":"Feature Flags","totalCount":7},{"category":"Feature Management","totalCount":7},{"category":"FireFox OS","totalCount":1},{"category":"Git","totalCount":5},{"category":"Git Workflows","totalCount":3},{"category":"GitHub","totalCount":6},{"category":"Google","totalCount":1},{"category":"Google Maps","totalCount":2},{"category":"Governance","totalCount":1},{"category":"IDE","totalCount":1},{"category":"IaaS","totalCount":1},{"category":"Identity","totalCount":2},{"category":"JavaScript","totalCount":11},{"category":"Joomla","totalCount":1},{"category":"Key Rotation","totalCount":1},{"category":"Key Vault","totalCount":8},{"category":"Localization","totalCount":1},{"category":"Managed Identity","totalCount":6},{"category":"Marketing","totalCount":1},{"category":"Microsoft","totalCount":43},{"category":"Networking","totalCount":1},{"category":"OWASP","totalCount":3},{"category":"Online Presence","totalCount":1},{"category":"PHP","totalCount":1},{"category":"PaaS","totalCount":6},{"category":"Personal Development","totalCount":1},{"category":"Protractor","totalCount":1},{"category":"SPA","totalCount":1},{"category":"SSL","totalCount":1},{"category":"Security","totalCount":21},{"category":"Security Center","totalCount":1},{"category":"Serverless","totalCount":6},{"category":"Sharpen Your C#","totalCount":3},{"category":"Single Page Applications","totalCount":8},{"category":"Social Media","totalCount":1},{"category":"SonarQube","totalCount":2},{"category":"Testing","totalCount":3},{"category":"Tips & Tricks","totalCount":12},{"category":"Virtual Machines","totalCount":7},{"category":"Visual Studio","totalCount":11},{"category":"Visual Studio Code","totalCount":2},{"category":"Visual Studio Team Services","totalCount":1},{"category":"Windows Phone","totalCount":5},{"category":"XAML","totalCount":3}],"archives":[{"archive":"2014","totalCount":14},{"archive":"2015","totalCount":2},{"archive":"2016","totalCount":10},{"archive":"2017","totalCount":23},{"archive":"2018","totalCount":14},{"archive":"2019","totalCount":16},{"archive":"2020","totalCount":13}]}},"pageContext":{"id":"563bd513-1dfd-54da-af84-525dc9ae0fe9","previousPostId":"030db946-15d7-5a4a-a3d2-2e1647ed3545","nextPostId":"094dd0f1-ea9b-5b0a-ad00-f3d1c403731d"}},
    "staticQueryHashes": ["4067043902"]}