private static void CheckForMissingConfigurationValues(ApplicationSettings applicationSettings, WebSettings webSettings)
        {
            string missingPropertyValues = string.Empty;

            if (applicationSettings != null)
            {
                //it's OK for the UniqueIdentifier to NOT have a value...
                foreach (PropertyInfo propertyInfo in applicationSettings.GetType().GetProperties().Where(p => p.Name != "UniqueIdentifier"))
                {
                    object propertyValue = propertyInfo.GetValue(applicationSettings, null);

                    if (propertyValue == null || string.IsNullOrEmpty(propertyValue.ToString()))
                    {
                        missingPropertyValues += "\tApplication: " + propertyInfo.Name + "\n";
                    }
                }
            }

            if (webSettings != null)
            {
                foreach (PropertyInfo propertyInfo in webSettings.GetType().GetProperties())
                {
                    object propertyValue = propertyInfo.GetValue(webSettings, null);

                    if (propertyValue == null || string.IsNullOrEmpty(propertyValue.ToString()))
                    {
                        missingPropertyValues += "\tWeb: " + propertyInfo.Name + "\n";
                    }
                }
            }

            if (missingPropertyValues != string.Empty)
            {
                throw new InvalidConfigurationException(applicationSettings, webSettings, "The following configuration settings are missing from database table 'cfg.Configuration'\n" + missingPropertyValues, InvalidConfigurationExceptionSeverity.Error);
            }

            //you may encounter an unhandled exception here when running the demo.
            //this UE is not present in the 'Licensed' version.
            //this is due to the obfuscation protection placed on Arachnode.SiteCrawler.dll.
            //press 'f5' and view the instructions in the console window.
        }