[英]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.