Ошибка чтения раздела пользовательской конфигурации: для этого объекта не определен конструктор без параметров - PullRequest
3 голосов
/ 13 марта 2012

С ужасным временем чтения пользовательского раздела конфигурации из web.config: Я использую конструктор разделов конфигурации (http://csd.codeplex.com/).

UPDATE:

вот ошибка, которую я получаю:

System.Configuration.ConfigurationErrorsException: произошла ошибка при создании обработчика раздела конфигурации для SendToTestConfig / sendToTestIndexConfig: для этого объекта не определен конструктор без параметров. (C: \ TFS \ Mainline \ Business.Utility.SendToTest \ Business.Utility.SendToTest \ web.config строка 20) ---> System.MissingMethodException: для этого объекта не определен конструктор без параметров. at System.RuntimeTypeHandle.CreateInstance (тип RuntimeType, логическое значение publicOnly, логическое значение noCheck, логическое значение и canBeCached, RuntimeMethodHandle & ctor, логическое значение & bNeedSecurityCheck) at System.RuntimeType.CreateInstanceSlow (логический publicOnly, логический fillCache) at System.RuntimeType.CreateInstanceImpl (логическое значение publicOnly, логическое значение skipVisibilityChecks, логическое значение fillCache)

Вот мой автоматически сгенерированный раздел конфигурации:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.225
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Business.Utility.SendToTest.Configuration
{


    /// <summary>
    /// The SendToTestIndexConfig Configuration Section.
    /// </summary>
    public partial class SendToTestIndexConfig : global::System.Configuration.ConfigurationSection
    {


        #region Singleton Instance
        /// <summary>
        /// The XML name of the SendToTestIndexConfig Configuration Section.
        /// </summary>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        internal const string SendToTestIndexConfigSectionName = "sendToTestIndexConfig";

        /// <summary>
        /// Gets the SendToTestIndexConfig instance.
        /// </summary>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        public static global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig Instance
        {
            get
            {
                return ((global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig)(global::System.Configuration.ConfigurationManager.GetSection(global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig.SendToTestIndexConfigSectionName)));
            }
        }
        #endregion

        #region Xmlns Property
        /// <summary>
        /// The XML name of the <see cref="Xmlns"/> property.
        /// </summary>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        internal const string XmlnsPropertyName = "xmlns";

        /// <summary>
        /// Gets the XML namespace of this Configuration Section.
        /// </summary>
        /// <remarks>
        /// This property makes sure that if the configuration file contains the XML namespace,
        /// the parser doesn't throw an exception because it encounters the unknown "xmlns" attribute.
        /// </remarks>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        [global::System.Configuration.ConfigurationPropertyAttribute(global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig.XmlnsPropertyName, IsRequired=false, IsKey=false, IsDefaultCollection=false)]
        public string Xmlns
        {
            get
            {
                return ((string)(base[global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig.XmlnsPropertyName]));
            }
        }
        #endregion

        #region IsReadOnly override
        /// <summary>
        /// Gets a value indicating whether the element is read-only.
        /// </summary>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        public override bool IsReadOnly()
        {
            return false;
        }
        #endregion

        #region appGroups Property
        /// <summary>
        /// The XML name of the <see cref="appGroups"/> property.
        /// </summary>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        internal const string appGroupsPropertyName = "appGroups";

        /// <summary>
        /// Gets or sets the appGroups.
        /// </summary>
        [global::System.CodeDom.Compiler.GeneratedCodeAttribute("ConfigurationSectionDesigner.CsdFileGenerator", "2.0.0.0")]
        [global::System.ComponentModel.DescriptionAttribute("The appGroups.")]
        [global::System.Configuration.ConfigurationPropertyAttribute(global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig.appGroupsPropertyName, IsRequired=true, IsKey=false, IsDefaultCollection=false)]
        public global::Business.Utility.SendToTest.Configuration.AppGroupSettingsCollection appGroups
        {
            get
            {
                return ((global::Business.Utility.SendToTest.Configuration.AppGroupSettingsCollection)(base[global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig.appGroupsPropertyName]));
            }
            set
            {
                base[global::Business.Utility.SendToTest.Configuration.SendToTestIndexConfig.appGroupsPropertyName] = value;
            }
        }
        #endregion
    }
}
namespace Business.Utility.SendToTest.Configuration
{
   ... 

А вот мой конфигурационный файл:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="SendToTestConfig" type="System.Configuration.ConfigurationSectionGroup, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
      <section name="sendToTestIndexConfig" type="Business.Utility.SendToTest.Configuration.SendToTestIndexConfig, Business.Utility.SendToTest.Configuration"/>
    </sectionGroup>
etc.

  </configSections>
    <SendToTestConfig xmlns="Business.Utility.SendToTest.Configuration">
      <sendToTestIndexConfig>
        <appGroups>
          <!-- TODO Change indexFileNamePrefix to desired value-->
          <appGroupSettings name="ItemBased" indexFileNamePrefix="S" indexFolderLocation="C:\TFS\Mainline\Business.Utility.SendToTest\Business.Utility.SendToTest" imageFolderLocation="C:\TFS\Mainline\Business.Utility.SendToTest\Business.Utility.SendToTest">
            <topicEntries>
              <topicEntry topicIDSuffix="DATE" addDuplicateVSAMEntry="true">
                <itemSubFields>
                  <subField index="0" typeName="Date"/>
                </itemSubFields>
              </topicEntry>
              <topicEntry topicIDSuffix="Item" addDuplicateVSAMEntry="true">
                <itemSubFields>
                  <subField index="0" typeName="ItemNumber"/>
                </itemSubFields>
              </topicEntry>
              <topicEntry topicIDSuffix="DESCR">
                <itemSubFields>
                  <subField index="0" typeName="LongDescription"/>
                </itemSubFields>
              </topicEntry>
            </topicEntries>
          </appGroupSettings>
      </appGroups>
    </sendToTestIndexConfig>
  </SendToTestConfig>
...
</configuration>

Я перепробовал все следующее, но я продолжаю получать null за первые несколько config (что, я думаю, имеет смысл) и получаю вышеупомянутое исключение для остальных.

//These return null:
SendToTestIndexConfig config = SendToTestIndexConfig.Instance;
//SendToTestIndexConfig config = (SendToTestIndexConfig) ConfigurationManager.GetSection("sendToTestIndexConfig");
//SendToTestIndexConfig configb = (SendToTestIndexConfig)WebConfigurationManager.GetSection("sendToTestIndexConfig");
//SendToTestIndexConfig configc = (SendToTestIndexConfig)WebConfigurationManager.OpenWebConfiguration(null).GetSection("sendToTestIndexConfig");
//SendToTestIndexConfig configd = (SendToTestIndexConfig)WebConfigurationManager.GetWebApplicationSection("sendToTestIndexConfig");
//SendToTestIndexConfig configf = (SendToTestIndexConfig)WebConfigurationManager.GetSection("sendToTestIndexConfig");


////These throw a "parameterless constructor error" on object "SendToTestConfig/sendToTestIndexConfig"
//SendToTestIndexConfig configg = (SendToTestIndexConfig)WebConfigurationManager.GetSection("SendToTestConfig/sendToTestIndexConfig");
//SendToTestIndexConfig configh = (SendToTestIndexConfig)WebConfigurationManager.OpenWebConfiguration(null).GetSection("SendToTestConfig/sendToTestIndexConfig");
//SendToTestIndexConfig configi = (SendToTestIndexConfig)WebConfigurationManager.GetWebApplicationSection("SendToTestConfig/sendToTestIndexConfig");
//SendToTestIndexConfig configj = (SendToTestIndexConfig)WebConfigurationManager.GetSection("SendToTestConfig/sendToTestIndexConfig");

Полагаю, это как-то связано с моим именованием. ConfigurationManager.AppSettings работает нормально, поэтому я знаю, что у меня есть правильный web.config.

Ответы [ 2 ]

4 голосов
/ 22 сентября 2012

На самом деле решение проблемы кратко изложено в примере для GenericEnumConverter на MSDN .Я сделал то же самое, что вы, вероятно, сделали, и явно установил атрибут [TypeConverter(typeof(GenericEnumConverter))] attrbibute в одном из моих свойств раздела конфигурации и получил ту же ошибку.В соответствии с документацией для GenericEnumConverter, указанной выше, вам не нужно устанавливать этот атрибут для использования преобразователя типа GenericEnumConverter - он вызывается неявно средой.Удалите этот атрибут из спецификаций свойств конфигурации, и эта ошибка должна исчезнуть, и все должно работать просто.

Вот пример свойства раздела конфигурации, в котором используется Enum:

    public enum UsernameFormat
    {
        DownLevelDomainName,
        UsernameOnly,
        UserPrincipalName
    }

    public class WindowsADElement : ConfigurationElement
    {
        // This property will implicitly use the GenericEnumConverter type converter.
        [ConfigurationProperty("usernameFormat", IsRequired=true, DefaultValue=UsernameFormat.UserPrincipalName)]
        public UsernameFormat UsernameFormat
        {
            get { return (UsernameFormat)this["usernameFormat"]; }
            set { this["usernameFormat"] = value; }
    }

Затем, чтобы использовать его в коде:

    MyConfigurationSection config = ConfigurationManager.GetSection("myConfigurationSection") as MyConfigurationSection;
    UsernameFormat format = config.UsernameLookup.WindowsAD.UsernameFormat;

Надеюсь, это поможет.

2 голосов
/ 14 марта 2012

Я не уверен, что это лучшее решение, но я смог обойти проблему.Ошибка была в том, что я использовал класс GenericEnumTypeConverter для преобразования строк конфигурации в перечисления AppGroup и SubFieldTypes.Я создал свой собственный TypeConverters, и это решило проблему.По-видимому, GenericEnumTypeConverter не имеет конструкторов без параметров, требующих тип enum для конструктора.Хотелось бы узнать, есть ли способ использовать GenericEnumTypeConverter, но это сработало для меня.

Это подсказало мне ответ: Ошибка конфигурации с пользовательским поведением

...