簡體   English   中英

在WebForms應用程序中讀取自定義配置文件

[英]Reading custom config file in WebForms app

我有自定義配置文件的類,可以在我的(沙盒)MVC應用程序和控制台應用程序中使用。 但是,當它從實際需要它的Web表單應用程序運行時,它無法讀取除頂級部分之外的任何內容。 它們都以框架.Net 4.5為目標。 自定義配置是一個“運營商”部分,其中包含運營商列表,每個運營商都有自己的設置。 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#config部分類(我認為)提供了強類型:

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;  }
    }
}

代碼隱藏的aspx.cs類中的代碼讀取它:

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#配置集合/元素:

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#配置集合/元素:

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屬性的集合為null:

?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"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM