Best Practice: Simplified Azure ServiceConfiguration

Best practices are considered as the most secure and optimised, but they don’t come free. Sometimes the cost is additional development and support efforts, and I am happy to concede the opposite argument that it is not always true.

If ServiceConfiguration.cscfg is not storing any sensitive information, the following simplified best practice would be lightweight and easy to manage. It is just using Visual Studio built-in feature called “Config Transformation”. Follow the simple hack and voilà,

1. Create transformation ServiceConfiguration.cscfg file set

  • Make a copy of ServiceConfiguration.cscfg.
  • Rename copy to ServiceConfiguration.Base.cscfg.
  • For each build configuration (e.g. Staging, Production), create a ServiceConfiguration.<build Config name>.cscfg file.

2. Edit the project

  • In Solution Explorer, right-click the project and click Unload Project. The project is marked (unavailable).
  • In Solution Explorer, right-click the unavailable project and click Edit . The project file opens in the Visual Studio XML Editor.
  • Find the following node
  <ItemGroup>
      <ServiceDefinition Include="ServiceDefinition.csdef" />
      <ServiceConfiguration Include="ServiceConfiguration.cscfg" />
  </ItemGroup>
  • Replace with following
    <ItemGroup>
      <ServiceDefinition Include="ServiceDefinition.csdef" />
      <ServiceConfiguration Include="ServiceConfiguration.cscfg" />
      <None Include="ServiceConfiguration.Base.cscfg">
          <DependentUpon>ServiceConfiguration.cscfg</DependentUpon>
      </None>
      <None Include="ServiceConfiguration.Staging.cscfg">
          <DependentUpon>ServiceConfiguration.cscfg</DependentUpon>
      </None>
      <None Include="ServiceConfiguration.Production.cscfg">
          <DependentUpon>ServiceConfiguration.cscfg</DependentUpon>
      </None>
  </ItemGroup>
  • Add the following at the end of the .ccproj file, just above </Project>
  <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" />
  <Target Name="BeforeBuild">
      <TransformXml Source="ServiceConfiguration.Base.cscfg" Transform="ServiceConfiguration.$(Configuration).cscfg" Destination="ServiceConfiguration.cscfg" />
  </Target>

3. Save, Close and Reload.

  • Save, and close the project file.
  • In Solution Explorer, right-click the unavailable project and click Reload Project.

For advanced user, you can also add the namespace to your ServiceConfiguration.cscfg or sometimes due to XML Transformation requirement it is essential.

<sc:ServiceConfiguration serviceName="NilayCornerService" osFamily="1" osVersion="*" xmlns:sc="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <sc:Role name="NilaysChef">
    <sc:Instances count="1" />
    <sc:ConfigurationSettings>
      <sc:Setting name="MyConnectionString" value="****************************" />
    </sc:ConfigurationSettings>
  </sc:Role>
</sc:ServiceConfiguration>

If you are looking for some tooling help then worth exploring SlowCheetah – XML Transforms 

Small development teams can also adopt the same transformation practices with CI/CD builds. You may also like to refer How to deploy solution to different instance size for Azure environments

Disclaimer

The views expressed on this site are personal opinions only and have no affiliation. See full disclaimerterms & conditions, and privacy policy. No obligations assumed.