㈠ 窗體應用程序如何來讀出web.config裡面得值c#
config
<appSettings>
<add key="Key1" value="ASS"/>
</appSettings>
cs
string ConfigKeyName = ConfigurationManager.AppSettings["Key1"];
引用using System.Configuration;
㈡ 如何高逼格讀取Web.config中的AppSettings
在ASP.NET網站里(也包括其他有web.config, app.config)的.NET工程里,讀AppSettings的值是個很常見的場景。比如:
<add key="EnableAzureWebTrace" value="true"/>
在代碼里讀的時候就會用到:
ConfigurationManager.AppSettings["EnableAzureWebTrace"];
這個[]索引器返回的是string類型。所以下一步咱們通常需要類型轉換才能在代碼里拿來用。比如這個例子里,咱們就要轉換成bool。其他時候,可能要轉換為int等類型。
string enableAzureWebTraceConfig = ConfigurationManager.AppSettings["EnableAzureWebTrace"];
bool enableAzureWebTrace = bool.Parse(enableAzureWebTraceConfig);
if(enableAzureWebTrace)
{
// do some logic
}
但問題是,config文件的值對於咱們代碼來說是不穩定因素,不可控的,這里拿回來的string未必能正確轉換格式。所以通常會用TryParse方法來防爆:
string enableAzureWebTraceConfig = ConfigurationManager.AppSettings["EnableAzureWebTrace"];
bool enableAzureWebTrace = false;
if (bool.TryParse(enableAzureWebTraceConfig, out enableAzureWebTrace) && enableAzureWebTrace)
{
// do some logic
}
else
{
throw new ConfigurationException("EnableAzureWebTrace value must be true of false.");
}
當然,不要忘了一點。讀出來的string有可能首先就是空的。所以又得加上對string的判斷,並且考慮到ConfigurationManager.AppSettings[]索引器本身可能會爆,所以還得加try-catch,最終代碼就變成這樣了:
try
{
string enableAzureWebTraceConfig = ConfigurationManager.AppSettings["EnableAzureWebTrace"];
if (!string.IsNullOrEmpty(enableAzureWebTraceConfig))
{
bool enableAzureWebTrace = false;
if (bool.TryParse(enableAzureWebTraceConfig, out enableAzureWebTrace) && enableAzureWebTrace)
{
// do some logic
}
else
{
throw new ConfigurationException("EnableAzureWebTrace value must be true of false.");
}
}
}
catch (ConfigurationException ce)
{
// error handling logic
throw;
}
這樣的代碼非常沒有逼格,重用性很差,如果自己的config裡面AppSettings比較多,或者一個settings在程序里到處被用,顯然不應該每次都把這樣的代碼到處復制。所以封裝一下唄:
public bool IsEnableAzureWebTrace()
{
try
{
bool enableAzureWebTrace = false;
string enableAzureWebTraceConfig = ConfigurationManager.AppSettings["EnableAzureWebTrace"];
if (!string.IsNullOrEmpty(enableAzureWebTraceConfig))
{
if (!bool.TryParse(enableAzureWebTraceConfig, out enableAzureWebTrace))
{
throw new ConfigurationException("EnableAzureWebTrace value must be true of false.");
}
}
return enableAzureWebTrace;
}
catch (ConfigurationException ce)
{
// error handling logic
return false;
}
}
現在要用到EnableAzureWebTrace的地方都只要調用public bool
IsEnableAzureWebTrace()就行了,就把如何讀config的邏輯抽離了。重構的目的是,萬一以後讀config的機制變了,只
要改這一處。不用到處改。但是,重構的粒度還不夠。這個方法只能用來讀EnableAzureWebTrace這一個設置。要通用一下,讓它也能
讀其他bool類型的設置。把key單獨的抽出來變成參數:
public bool GetBooleanConfiguration(string key)
{
try
{
bool val = false;
string rawConfigValue = ConfigurationManager.AppSettings[key];
if (!string.IsNullOrEmpty(rawConfigValue))
{
if (!bool.TryParse(rawConfigValue, out val))
{
throw new ConfigurationException(string.Format("{0} value must be true of false.", key));
}
}
return val;
}
catch (ConfigurationException ce)
{
// error handling logic
return false;
}
}
但是這還不夠,因為這個方法只能滿足於bool類型的config,咱們希望有個公用的方法,能讀取其他類型。這時候就需要用泛型了。把返回類型給抽離出來。
難點在於,每種數據類型的類型轉換寫法不一樣。比如bool類型是bool.TryParse,int類型是int.TryParse,怎麼把這部分邏輯抽象出來呢?
一種辦法是用C#本身的類型轉換:
(T) Convert.ChangeType(rawConfigValue, typeof (T));
另一種是把類型轉換的邏輯作為委託加在方法的參數里,這樣就用lambda表達式去傳,咱比較偏向這種方法,因為方法的調用者能非常清晰的知道「該幹嘛,該怎麼干」。
這時候,如果因為非法類型轉換爆,是得讓調用者知道的。所以個人偏向把TryParse改為Parse,死就要死個明白。
public T GetConfiguration<T>(Func<string, T> parseFunc, string key)
{
try
{
T val = default(T);
string rawConfigValue = ConfigurationManager.AppSettings[key];
if (!string.IsNullOrEmpty(rawConfigValue))
{
return parseFunc(rawConfigValue);
}
return val;
}
catch (ConfigurationException ce)
{
// error handling logic
return default(T);
}
}
現在,調用這個方法就能這樣去寫:
GetConfiguration<bool>(bool.Parse, "EnableAzureWebTrace");
看起來已經很牛逼了。但其實還不夠。考慮到之前說的config值為空字元串的問題,安全一點的做法是,當遇到空字元串時候,返回一個默認值。因為
這種錯誤,並不是key不存在的錯誤,而是key存在,但是值沒填。非法值是應該認為錯誤的。但是空值個人認為更應該處理為一種「警告」,是應該有
fallback的策略的,而非不可饒恕的錯誤。為了返回默認值,咱們可以多加一個委託。
public T GetConfiguration<T>(Func<string, T> parseFunc, Func<T> defaultTValueFunc, string key)
{
try
{
string rawConfigValue = ConfigurationManager.AppSettings[key];
return !string.IsNullOrEmpty(rawConfigValue) ?
parseFunc(rawConfigValue) :
defaultTValueFunc();
}
catch (ConfigurationException ce)
{
// error handling logic
return default(T);
}
}
現在,調用者就能靈活處理遇到config為空時候的默認值了:
GetConfiguration<bool>(bool.Parse, () => false, "EnableAzureWebTrace");
但是如果每次都在條件判斷里寫上面那樣的語句是挺麻煩的,在一般的系統開發中,常常會用一個管理配置的Settings類來對應
Web.config里的設置表,維護這個關系。為了使用方便,咱們會把每個Settings的名字,也就是key,作為屬性去暴露給調用者,於是就能
這樣寫:
public bool EnableAzureWebTrace
{
get
{
return GetConfiguration<bool>(bool.Parse, () => false, "EnableAzureWebTrace");
}
}
以為裝逼結束了嗎?當然不行!沒發現,屬性名稱和傳進去的string類型的key名稱是重復的嗎?這樣寫代碼是不是有點蛋疼?而且最慘的是,
在VS2015,C#6.0之前(也就是下版本的C#),string這種東西,要是寫錯了是編譯不出來的,所以應該盡量避免用string傳
key。經常會發生改了屬性名,沒有一起改string值的悲劇。比如MVVM框架的RaisePropertyChanged(string)就經常坑
爹(題外話)。。。
好在,.NET4.5有個CallerMemberName特性,意思是」調用咱的方法叫什麼名字」,就能幫咱們把這個string參數擼掉。
所以,只需要把方法簽名里的string key改成:
public T GetConfiguration<T>(Func<string, T> parseFunc, Func<T> defaultTValueFunc, [CallerMemberName]string key = "")
這樣這個方法被調用的時候,key就會自動賦值為調用它的方法或屬性名。然後,剛才的那個屬性就能夠這樣去寫:
public bool EnableAzureWebTrace
{
get
{
return GetConfiguration<bool>(bool.Parse, () => false);
}
}
以為裝逼真的結束了嗎?還有最後一步。萬一要是碰到有些情況,屬性名真的和appSettings里的key名字不一樣怎麼辦?為了靈活處理這種
邊緣情況,還可以加個參數,強擼這種名稱不一樣的情況,如果這個參數被賦值了(下面的supressKey),就用它去讀config而不用傳入
的key。
下面給出咱博客里讀AppSettings的通用代碼:
private T TryGetValueFromConfig<T>(Func<string, T> parseFunc, Func<T> defaultTValueFunc,
[CallerMemberName]string key = "", string supressKey = "")
{
try
{
if (!supressKey.IsNullOrEmptyOrWhiteSpace())
{
key = supressKey;
}
var node = ConfigurationManager.AppSettings[key];
return !string.IsNullOrEmpty(node) ? parseFunc(node) : defaultTValueFunc();
}
catch (Exception ex)
{
Logger.Error(string.Format("Error Reading web.config on AppSettings node: {0}", key), ex);
return default(T);
}
}
現在,就能靈活裝逼了,給幾個例子:
string類型,屬性名和key不一樣,默認值「FileSystemImageProvider」:
public string PostImageProvider
{
get
{
return TryGetValueFromConfig(_ => _, () => "FileSystemImageProvider", supressKey: "ImageProvider");
}
}
bool類型,默認值想要true
public bool
{
get
{
return TryGetValueFromConfig(bool.Parse, () => true);
}
}
int類型,默認值為20
public int
{
get
{
return TryGetValueFromConfig(int.Parse, () => 20);
}
}
㈢ .net 如何在web.config中讀取自定義節點以及注意的問題
要創建自定義設置 要求有2步:寫cs代碼 和 修改web.config代碼這里我們創建了一個簡單的handler ,此handler 用在web.config文件中。 using system; using system.collections; using system.xml; using system.configuration; using system.web.configuration; namespace devhood { internal class pagestylehandler:iconfigurationsectionhandler { public virtual object create(object parent, object context, xmlnode node) { pagestyle config = new pagestyle((pagestyle)parent); config.(node); return config; } } public class pagestyle { string _backcolour; internal pagestyle(pagestyle parent) { if (parent != null) _backcolour = parent._backcolour; } internal void (xmlnode node) { xmlattributecollection attribcol = node.attributes; _backcolour = attribcol["backcolour"].value; } public string backcolour { get { return _backcolour; } } } } 這里有兩個類:繼承iconfigurationsectionhandler介面的pagestylehandler類 和 用於從webconfig返回數據的pagestyle類。pagestyle 類可以讀取一個xml 節點(自web.config)並且把節點數據保存的backcolour屬性中。 設置web.config文件 為了能夠訪問pagestylehandler必須對web.config做相應的配置。 這樣就可以在你的web應用中 訪問自己定義的節點了。
㈣ asp怎麼讀web.config
你直接讀取文件然後用正則或者substring取吧。
讀取文件參考:
http://www.w3school.com.cn/asp/met_opentextfile.asp
正則使用參考:
http://www.jb51.net/article/20816.htm
我按照我項目里的web.config文件給你寫一個正則,捕獲元組捕獲到的就是連接字元串。
connectionString="([\s\S]*?)"
不一定完全適用,根據.NET版本的不同web.config文件的結構可能有變化。
㈤ 讀取Web.Config文件連接字元串出錯
你申明的變數時string型,返回類型卻是ConnectionString
要獲取WEB.CONFIG的鏈接字元串應該這樣寫:
public static string ConnStr()
{
string conn = "";
conn = System.Configuration.ConfigurationManager.ConnectionStrings["YSDataString"].ConnectionString;
return conn;
}
㈥ asp.net 讀寫配置文件Web.Config
1、web.config作為asp.net的配置文件,是無法使用程序去修改的,也不建議你手動去修改wen.cofnig。因為你一旦修改了web.config,整個網站就會自動的重啟。
2、讀取config文件,你只能讀取appSettings和connectionStrings節點中的值,語法如下:
using System.Configuration; //引入命名空間
ConfigurationManager.AppSettings["名稱"]; //讀取appSettings
ConfigurationManager.ConnectionStrings["名稱"] //讀connectionStrings
建議:若你有大量的配置信息需要修改,可以添加一個XML文件,把所有的配置信息放入這個XML中,並把這個XML的後綴改成xxx.config(aspnet_isapi不會去解析後綴是config的文件的,這樣即使別人知道了你的文件路徑,使用瀏覽器也無法查看問文件內容)。這樣做不進保證了web.config的整潔,管理起來也方便很多。Discuz論壇不知道你有沒有看過,它的配置文件就是這樣做的,你有興趣的話,可以下載源碼參考下。
希望我的回答對你有幫助!
㈦ ASP.NET MVC 4中如何讀取web.config中的配置
用ConfigurationManager這個類。
㈧ configurationmanager.getsection 只能讀 web.config文件嗎
是的。
GetSection方法讀取的是configSections節點,這個節點在web.config配置文件中,
它比較特殊,必須放置於首節點,也就是說,在它之前不能有其它類型的節點。configSections子節點有section和sectionGroup,後者是前者的集合節點。
㈨ web.config 讀取問題
我們一般只用讀取web.config或app.config配置的語句.
在引用里填加System.Configuration
然後可以用
System.Configuration.ConfigurationManager.AppSettings[Key]去根據key讀config里的配置值.
比如在web,.config的<configuration>節點里有:
<appSettings>
<add key="test" value="testValue"/>
</appSettings>
那麼:
string x=System.Configuration.ConfigurationManager.AppSettings["test"].ToString();
x的值為"testValue";