2017-01-23 145 views
3

我有一些要在自定義配置文件中讀取的類,這些文件在我的(沙箱)MVC應用程序和控制檯應用程序中工作。但是,當它從實際需要的Web窗體應用程序運行時,它將無法讀取除頂層部分之外的任何內容。他們都以.NET 4.5爲框架。 自定義配置是一個「運營商」部分,其中包含運營商列表,每個運營商都有自己的設置。 web.config中提取:在WebForms應用程序中讀取自定義配置文件

<?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#的配置部分類提供的強類型:

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

所以當您運行它時,沒有錯誤,但是當您在調試器中檢查變量時,載體屬性的集合爲空:

?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} 
    ... 

如果這包含了一些明顯的假通道,那麼我很抱歉,但這讓我分心;我需要在幾天前發佈此修復程序!

+0

凡被定義'limits','limit'和'services','service'?如果我在配置中刪除這些節點,我會得到2個運營商。 – krlzlx

+0

感謝您的期待!爲了提高可讀性,我刪除了它們。但是,如果我替換它們,它仍然沒有返回載體集合,所以我已經在我的問題中恢復了它們,並且希望能夠再看一看? –

+0

對不起,我無法重現您的問題。即使有限制和服務節點,我也獲得了2個運營商。您的'CarrierSection'在Web.config或單獨的配置文件中? – krlzlx

回答

2

您的Web.config文件,其中位於您的自定義配置文件parcelcarriers.config指定:

<CarrierSection configSource="parcelcarriers.config"/> 
相關問題