private ServiceInfo(
            Uri healthServiceUrl,
            string healthVaultVersion,
            HealthServiceShellInfo shellInfo,
            IList<HealthServiceMethodInfo> methods,
            IList<Uri> includes,
            Dictionary<string, string> configurationValues)
        {
            _healthServiceUrl = healthServiceUrl;
            _healthVaultVersion = healthVaultVersion;
            _shellInfo = shellInfo;

            _methods =
                new ReadOnlyCollection<HealthServiceMethodInfo>(methods);
            _includes =
                new ReadOnlyCollection<Uri>(includes);

            if (configurationValues != null)
            {
                _configurationValues = configurationValues;
            }
        }
        /// <summary>
        /// Constructs a <see cref="HealthServiceShellInfo"/> object from the  
        /// supplied XML.
        /// </summary>
        /// 
        /// <param name="nav">
        /// An XPathNavigator to access the XML from which the 
        /// <see cref="HealthServiceShellInfo"/> object will be constructed.
        /// </param>
        /// 
        /// <returns>
        /// A <see cref="HealthServiceShellInfo"/> object.
        /// </returns>
        /// 
        /// <exception cref="UriFormatException">
        /// A URL string returned by HealthVault is
        /// invalid.
        /// </exception>
        /// 
        internal static HealthServiceShellInfo CreateShellInfo(
            XPathNavigator nav)
        {
            Uri baseUrl = new Uri(nav.SelectSingleNode("url").Value);
            Uri redirectUrl =
                new Uri(nav.SelectSingleNode("redirect-url").Value);

            XPathNodeIterator tokenNavs = nav.Select("redirect-token");

            List<HealthServiceShellRedirectToken> redirectTokens =
                new List<HealthServiceShellRedirectToken>();

            foreach (XPathNavigator tokenNav in tokenNavs)
            {
                string token = tokenNav.SelectSingleNode("token").Value;
                string description =
                    tokenNav.SelectSingleNode("description").Value;

                string queryParams = tokenNav.SelectSingleNode(
                    "querystring-parameters").Value;

                string[] queryStringParameters =
                    queryParams.Split(new Char[] { ',' });

                HealthServiceShellRedirectToken redirectToken =
                    new HealthServiceShellRedirectToken(token, description, queryStringParameters);

                redirectTokens.Add(redirectToken);
            }

            HealthServiceShellInfo shellInfo =
                new HealthServiceShellInfo(baseUrl, redirectUrl, redirectTokens);

            return shellInfo;
        }