isEmptyElementVisible And isPresent Metadata Introduction

One of the latest additions in IIS configuration is new set of metadata properties that are available as a hotfix in IIS 7.0. 

"IsEmptyElementVisible" -  This property can be set to true or false and only applies to custom schema in which you have an attributeless element that is not part of a collection and is not defining a collection.  This metadata property allows a user to force configuration of this kind to be visible in applicationHost.config. 

"isPresent" - This compliments the above metadata by providing a bool value which will inform a user that a particular configuration element as described above will be physically present in the applicationHost.config file. 

Below is some example schema where 'myElement' is the particular element that I would like to use with these two metadata properties. 

<configSchema>
  <sectionSchema name="system.webServer/customSchema">
    <element name="myElement">
    <attribute name="isTimed" type="bool" defaultValue="false" />
    <attribute name="isShort" type="bool" defaultValue="true" />
      <collection addElement="add" clearElement="clear" removeElement="remove">
        <attribute name="value" type="string" required="true" isUniqueKey="true" />
      </collection>
    </element>
  </sectionSchema>
</configSchema>

Given this schema, the below code will help make use of these new metadata properties.  In this example, I am using C# wrapper code for the AHADMIN library.

AppHostWritableAdminManager writableManager = new AppHostWritableAdminManager();

IAppHostElement element = writableManager.GetAdminSection("system.webServer/customSchema", "MACHINE/WEBROOT/APPHOST");

IAppHostElement myElement = element.GetElementByName("myElement");

myElement.SetMetadata("isEmptyElementVisible", true);

writableManager.CommitPath = "MACHINE/WEBROOT/APPHOST";

writableManager.CommitChanges();

// at this point 'myElement' should have been made present in applicationHost.config, this can be checked with "isPresent" below 

AppHostAdminManager readableManager = new AppHostAdminManager();

IAppHostElement element = readableManager.GetAdminSection("system.webServer/customSchema","MACHINE/WEBROOT/APPHOST");

IAppHostElement myElement = element.GetElementByName("myElement");

object metadata = myElement.GetMetadata("isPresent");

Console.WriteLine(metadata.ToString().ToLower());

 

 

If this solves a problem for you, more information can be found about this hotfix as well as how to download it below.

http://support.microsoft.com/kb/970773

 

 

No Comments