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}
...
如果這包含了一些明顯的假通道,那麼我很抱歉,但這讓我分心;我需要在幾天前發佈此修復程序!
凡被定義'limits','limit'和'services','service'?如果我在配置中刪除這些節點,我會得到2個運營商。 – krlzlx
感謝您的期待!爲了提高可讀性,我刪除了它們。但是,如果我替換它們,它仍然沒有返回載體集合,所以我已經在我的問題中恢復了它們,並且希望能夠再看一看? –
對不起,我無法重現您的問題。即使有限制和服務節點,我也獲得了2個運營商。您的'CarrierSection'在Web.config或單獨的配置文件中? – krlzlx