在 WebForms 应用程序中读取自定义配置文件

Reading custom config file in WebForms app

我有 classes 可以读取自定义配置文件,它在我的(沙盒)MVC 应用程序和控制台应用程序中工作。但是,当它是 运行 来自实际需要它的 Web 表单应用程序时,它无法读取除顶级部分以外的任何内容。它们都以 .Net 4.5 框架为目标。 自定义配置是一个包含运营商列表的 'carrier' 部分,每个运营商都有自己的设置。 web.config 提取:

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section name="CarrierSection" type="SmallWFApp.CarrierSection"/>
    </configSections>

自定义配置部分文件:

<?xml version="1.0"?>
<CarrierSection>
  <carriers>
    <carrier name="ups" default-code="UPS0041" >
      <pickupreq value="N"/>
      <limits>
        <limit name="non-doc" weight="200" length="270" width="165" height="165" square="330" />
        <limit name="doc" weight="2.5"  length="0" width="0" height="0" square="0" />
        <limit name="consignment" max-eu="200" max-world="0"/>
      </limits>
      <services>
        <service name="document" caption="DOCUMENT EXPRESS" code="D" live="Y"/>
        <service name="parcel" caption="EXPRESS" code="N" live="Y" />
        <service name = "road" caption="ECONOMY ROAD" code="P" live="N" />
      </services>
    </carrier>
    <carrier name="dhl" default-code="DHL0014" >
      <pickupreq value="Y"/>
      <limits >
        <limit name="non-doc" weight="200" length="270" width="165" height="165" square="330"  />
        <limit name="doc"  weight="2.5"  length="0" width="0" height="0" square="0"/>
      </limits>
      <services>
        <service name="9am" caption="NEXT DAY 9AM"  code="9" />
        <service name = "noon" caption="NEXT DAY 12NOON"  code="2" />
      </services>
    </carrier>
  </carriers>
</CarrierSection>

C# 配置部分 class(我认为)提供强类型:

using System;
using System.Configuration;

namespace SmallWFApp
{
public class CarrierSection : ConfigurationSection
{
    [ConfigurationProperty("carriers")]
    public CarrierElementCollection Carriers
    {
        get { return this["carriers"] as CarrierElementCollection; }
    }
}

//-----------------------------------------

public class CarrierElementCollection : ConfigurationElementCollection
{
    protected override ConfigurationElement CreateNewElement()
    {
        return new CarrierElement();
    }
    protected override object GetElementKey(ConfigurationElement element)
    {
        return ((CarrierElement)element).Name;
    }
    public override ConfigurationElementCollectionType CollectionType
    {
        get { return ConfigurationElementCollectionType.BasicMap; }
    }
    protected override string ElementName
    {
        get { return "carrier"; }
    }
    public CarrierElement this[int index]
    {
        get { return (CarrierElement)BaseGet(index); }
        set
        {
            if (BaseGet(index) != null)
            {
                BaseRemoveAt(index);
            }
            BaseAdd(index, value);
        }
    }
    new public CarrierElement this[string employeeID]
    {
        get { return (CarrierElement)BaseGet(employeeID); }
    }
    public bool ContainsKey(string key)
    {
        bool result = false;
        object[] keys = BaseGetAllKeys();
        foreach (object obj in keys)
        {
            if ((string)obj == key)
            {
                result = true;
                break;
            }
        }
        return result;
    }
}

//-----------------------------------------------------------------
public class CarrierElement : ConfigurationElement
{
    [ConfigurationProperty("name", DefaultValue = "Other", IsRequired = true, IsKey = true)]
     public string Name
    {
        get { return this["name"] as string; }
        set  { this["name"] = value;  }
    }


    [ConfigurationProperty("default-code", IsRequired = true)]
    public string DefaultCode
    {
        get  { return this["default-code"] as string;  }
        set  {  this["default-code"] = value;  }
    }

    [ConfigurationProperty("pickupreq")]
    public ReqPickupConfigElement ReqPickup
    {
        get  {  return base["pickupreq"] as ReqPickupConfigElement;  }
    }


    [ConfigurationProperty("limits")]
    public LimitElementCollection Limits
    {
        get  { return this["limits"] as LimitElementCollection; }
    }

    [ConfigurationProperty("services")]
    public ServiceElementCollection Services
    {
        get  { return this["services"] as ServiceElementCollection;  }
    }
}


//--------------------------------------------

public class ReqPickupConfigElement : System.Configuration.ConfigurationElement
{
    [ConfigurationProperty("value", DefaultValue = "N")]
    [StringValidator(MinLength = 1, MaxLength = 1)]

    public string Value
    {
        get   {  return base["value"] as string;  }
    }
}

code-behind-aspx.csclass中读取它的代码:

try
{
    CarrierSection config =
                        (CarrierSection)System.Configuration.ConfigurationManager.GetSection(
                        "CarrierSection");

    if (config != null)
    {
        foreach (CarrierElement app in config.Carriers)
        {
            //... (never comes in here) ...
        }

        //lbConfigread.Text = found.ToString();
    }
}
catch (Exception ex)
{
    //...
}

c#配置collection/elements读取每个运营商的'limits':

namespace SmallWFApp
{
    public class LimitElementCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new LimitElement();
        }
        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((LimitElement)element).Name;
        }
        public override ConfigurationElementCollectionType CollectionType
        {
            get { return ConfigurationElementCollectionType.BasicMap; }
        }
        protected override string ElementName
        {
            get { return "limit"; }
        }
        public LimitElement this[int index]
        {
            get { return (LimitElement)BaseGet(index); }
            set
            {
                if (BaseGet(index) != null)
                {
                    BaseRemoveAt(index);
                }
                BaseAdd(index, value);
            }
        }
        new public LimitElement this[string employeeID]
        {
            get { return (LimitElement)BaseGet(employeeID); }
        }
        public bool ContainsKey(string key)
        {
            bool result = false;
            object[] keys = BaseGetAllKeys();
            foreach (object obj in keys)
            {
                if ((string)obj == key)
                {
                    result = true;
                    break;
                }
            }
            return result;
        }
    }
    public class LimitElement : ConfigurationElement
    {
        [ConfigurationProperty("name", IsRequired = true, IsKey = true)]
        public string Name
        {
            get { return this["name"] as string; }
            set  {  this["name"] = value;  }
        }

        [ConfigurationProperty("weight", IsRequired = false)]
        public string Weight
        {
            get  {  return this["weight"] as string;  }
            set {  this["weight"] = value; }
        }

        [ConfigurationProperty("length", IsRequired = false)]
        public string Length
        {
            get  {  return this["length"] as string; }
            set  { this["length"] = value;  }
        }
        [ConfigurationProperty("width", IsRequired = false)]
        public string Width
        {
            get  { return this["width"] as string; }
            set  { this["width"] = value;  }
        }
        [ConfigurationProperty("height", IsRequired = false)]
        public string Height
        {
            get  { return this["height"] as string; }
            set { this["height"] = value;  }
        }
        [ConfigurationProperty("square", IsRequired = false)]
        public string Square
        {
            get {  return this["square"] as string;  }
            set  { this["square"] = value; }
        }

        // for total consignment

        [ConfigurationProperty("max-eu", IsRequired = false)]
        public string MaxEU
        {
            get  {  return this["max-eu"] as string;  }
            set  {  this["max-eu"] = value;  }
        }
        [ConfigurationProperty("max-world", IsRequired = false)]
        public string MaxWorld
        {
            get  { return this["max-world"] as string; }
            set  { this["max-world"] = value;  }
        }
    }
}

c#配置collection/elements读取每个运营商的'service':

namespace SmallWFApp
{
    public class ServiceElementCollection : ConfigurationElementCollection
    {
        protected override ConfigurationElement CreateNewElement()
        {
            return new ServiceElement();
        }
        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((ServiceElement)element).Name;
        }
        public override ConfigurationElementCollectionType CollectionType
        {
            get { return ConfigurationElementCollectionType.BasicMap; }
        }
        protected override string ElementName
        {
            get { return "service"; }
        }
        public ServiceElement this[int index]
        {
            get { return (ServiceElement)BaseGet(index); }
            set
            {
                if (BaseGet(index) != null)
                {
                    BaseRemoveAt(index);
                }
                BaseAdd(index, value);
            }
        }
        new public ServiceElement this[string employeeID]
        {
            get { return (ServiceElement)BaseGet(employeeID); }
        }
        public bool ContainsKey(string key)
        {
            bool result = false;
            object[] keys = BaseGetAllKeys();
            foreach (object obj in keys)
            {
                if ((string)obj == key)
                {
                    result = true;
                    break;
                }
            }
            return result;
        }
    }
    public class ServiceElement : ConfigurationElement
    {
        [ConfigurationProperty("name", IsRequired = true, IsKey = true)]
        public string Name
        {
            get {  return this["name"] as string; }
            set  { this["name"] = value;  }
        }

        [ConfigurationProperty("caption", IsRequired = true)]
        public string Caption
        {
            get  { return this["caption"] as string; }
            set  { this["caption"] = value;  }
        }

        [ConfigurationProperty("code", IsRequired = true)]
        public string Code
        {
            get  { return this["code"] as string;  }
            set { this["code"] = value;  }
        }

        [ConfigurationProperty("live", IsRequired = false)]
        public string Live
        {
            get  {  return this["live"] as string;  }
            set  {  this["live"] = value; }
        }
    }
}

所以当你 运行 它时,没有错误,但是当你在调试器中检查变量时,carrier 属性 的集合是空的:

?config.Carriers
Count = 0
    AddElementName: "add"
    ClearElementName: "clear"
    CollectionType: BasicMap
    Count: 0
    CurrentConfiguration: null
    ElementInformation: {System.Configuration.ElementInformation}
    ElementName: "carrier"
    ElementProperty: {System.Configuration.ConfigurationElementProperty}
    ...
    Properties: {System.Configuration.ConfigurationPropertyCollection}
    ...

如果这包含一些明显的失礼,那么我很抱歉,但这让我分心了;我需要在几天前发布此修复程序!

您必须在 Web.config 文件中指定自定义配置文件所在的位置 parcelcarriers.config:

<CarrierSection configSource="parcelcarriers.config"/>