【问题标题】:Something missing in my C# custom config implementation我的 C# 自定义配置实现中缺少一些东西
【发布时间】:2013-08-20 14:09:09
【问题描述】:

我尝试编写一个具有自定义配置实现的应用程序 - 为此,我编写了一个小型虚拟应用程序,以后可以使用它。但是,我只是无法加载配置。关于我在这里缺少的任何想法都会有真正的帮助。

配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!-- Configuration section-handler declaration area. -->
    <configSections>
        <sectionGroup name="SecuritySettingsGroup">
            <section name="SecuritySettings" type="ConfigSecHandler.ServicesSection, ConfigSecHandler"/>
        </sectionGroup>
        <!-- Other <section> and <sectionGroup> elements. -->
    </configSections>
    <!-- Configuration section settings area. -->
    <SecuritySettingsGroup>
        <SecuritySettings>
            <ServiceSecuritySettings>
                <Service svcName="xStore" svcUser="user1" svcPermissions="pemission1"/>
                <Service svcName="xStore" svcUser="user2" svcPermissions="pemission3"/>
            </ServiceSecuritySettings>
        </SecuritySettings>
    </SecuritySettingsGroup>
</configuration>

using System;
using System.Collections.Generic;
using System.Text;
using System.Configuration;
using System.Xml;

namespace ServicesConfigSection {
    public class ServicesSection : ConfigurationSection {

        [ConfigurationProperty("ServiceSecuritySettings", IsDefaultCollection = false)]
        [ConfigurationCollection(typeof(ServiceCollection),
            AddItemName = "Service")]
        public ServiceCollection Services {
            get { return (ServiceCollection)this["ServiceSecuritySettings"]; }
            set { this["ServiceSecuritySettings"] = value; }
        }

        public static ServicesSection GetConfiguration() {
            return GetConfiguration("SecuritySettingsGroup/SecuritySettings");
        }

        public static ServicesSection GetConfiguration(string section) {
            return ConfigurationManager.GetSection(section) as ServicesSection;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace ServicesConfigSection {

    public class ServiceCollection : ConfigurationElementCollection {

        protected override ConfigurationElement CreateNewElement() {
            return new ServiceElement();
        }

        protected override object GetElementKey(ConfigurationElement element) {
            return ((ServiceElement)element).SvcName;
        }

        public override ConfigurationElementCollectionType CollectionType {
            get { return ConfigurationElementCollectionType.AddRemoveClearMap; }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace ServicesConfigSection {
    public class ServiceElement : ConfigurationElement {

        [ConfigurationProperty("svcName", DefaultValue = "", IsRequired = true)]
        public String SvcName {
            get { return (String)this["svcName"]; }
            set { this["svcName"] = value; }
        }

        [ConfigurationProperty("svcUser", DefaultValue = "", IsRequired = true)]
        public String SvcUser {
            get { return (String)this["svcUser"]; }
            set { this["svcUser"] = value; }
        }

        [ConfigurationProperty("svcPermissions", DefaultValue = "", IsRequired = true)]
        public String SvcPermissions {
            get { return (String)this["svcPermissions"]; }
            set { this["svcPermissions"] = value; }
        }
    }
}

主要

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using ServicesConfigSection;

namespace TestApp {
    class Program {
        static void Main(string[] args) {

            ServicesSection svcConfig = ServicesSection.GetConfiguration();
            foreach (ServiceElement thisConfig in svcConfig.Services) {
                Console.WriteLine(thisConfig.SvcName);
            }
        }
    }
}

加载 XML 时遇到的错误

System.Configuration.ConfigurationErrorsException 未处理 消息=为 SecuritySettingsGroup/SecuritySettings 创建配置节处理程序时出错:无法从程序集“ConfigSecHandler”加载类型“ConfigSecHandler.ServicesSection”。 (######\TestApp\bin\Debug\TestApp.vshost.exe.config 第 6 行)

虚拟主机配置

<?xml version="1.0" encoding="utf-8" ?> 
<configuration>
<!--  Configuration section-handler declaration area.  --> 
<configSections>
<sectionGroup name="SecuritySettingsGroup">
<section name="SecuritySettings" type="ServicesConfigSection.ServicesSection, ServicesConfigSection" /> 
</sectionGroup>
<!--  Other <section> and <sectionGroup> elements.--> 
</configSections>
<!--  Configuration section settings area.--> 
<SecuritySettingsGroup>
<SecuritySettings>
<ServiceSecuritySettings>
<Service svcName="xStore" svcUser="user1" svcPermissions="pemission1" /> 
<Service svcName="xStore" svcUser="user2" svcPermissions="pemission3" /> 
</ServiceSecuritySettings>
</SecuritySettings>
</SecuritySettingsGroup>
</configuration>

http://db.tt/qH5rJx2D - Application Structure & Properties

【问题讨论】:

  • 您的 TestApp.vshost.exe.config 文件是什么样的?您是否尝试过清理解决方案并重建?还是删除bin文件夹并重建?
  • 命名空间是否正确? type="ConfigSecHandler.ServicesSection
  • @prmech - 是的,我已经尝试清理我的 colution 并重建它。我也尝试删除 Bin 文件夹,但它也不起作用。添加了我的虚拟主机配置。
  • @stepandohnal - 我相信是的,我已经更新了更多数据。有人可以在这里检查并帮助我。我今天会尝试做更多的研究。

标签: c# custom-configuration


【解决方案1】:

我在您的代码中没有看到 ConfigSecHandler。尝试将您的 Xml 更改为

type="ServicesConfigSection.ServicesSection, ServicesConfigSection"

【讨论】:

    【解决方案2】:

    更多的研究让我来到这里 - http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

    上面链接中的最后一条评论告诉了我确切的故事。 app.config 应该将类名完全分类为类型:-

    <section name="SecuritySettings" type="ServicesConfigSection.ServicesSection, ConfigSecHandler"/>
    

    【讨论】:

      猜你喜欢
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多