『壹』 .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應用中 訪問自己定義的節點了。
『貳』 win7下面用IIS部署系統,出現web.config無法寫入配置文件
樓主~不對啊
怎麼看你的網站里又是*.asp又是*.aspx這個好像不能共存吧?
無法讀寫問題應該是你的網站文件夾屬性配置的不正確
你可以按照圖片上的配置試一下
把讀寫都選上
『叄』 ASP.NET MVC 4中如何讀取web.config中的配置
用ConfigurationManager這個類。
『肆』 如何高逼格讀取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);
}
}
『伍』 C#怎麼讀取自定義web.config配置
<appSettings>
<add key="ConnectionString" value="server=192.168.19.250;database=hrms_test;uid=pmstest;pwd=pmstest" />
<add key="WebObjectPath" value="http://localhost/LMS/Files/" />
<add key="PhysicsObjectPath" value="E:/Files/"/>
<add key="SystemCode" value="12" />
<add key="OrganizationPath" value ="organization" />
</appSettings>
System.Configuration.ConfigurationManager.AppSettings["ConnectionString"].ToString();
『陸』 asp.net(c#)中動態更改web.config連接資料庫參數
讀寫XML的方式修改存儲web.config
但是,如果想動態修改connectionstring,建議別放在web.config中,自己建立一個XML文件進行讀寫
附上一個實例:
已知有一個XML文件(bookstore.xml)如下:
<?xml
version="1.0"
encoding="gb2312"?>
<bookstore>
<book
genre="fantasy"
ISBN="2-3631-4">
<title>Oberon's
Legacy</title>
<author>Corets,
Eva</author>
<price>5.95</price>
</book>
</bookstore>
1、往<bookstore>節點中插入一個<book>節點:
XmlDocument
xmlDoc=new
XmlDocument();
xmlDoc.Load("bookstore.xml");
XmlNode
root=xmlDoc.SelectSingleNode("bookstore");//查找<bookstore>
XmlElement
xe1=xmlDoc.CreateElement("book");//創建一個<book>節點
xe1.SetAttribute("genre","李贊紅");//設置該節點genre屬性
xe1.SetAttribute("ISBN","2-3631-4");//設置該節點ISBN屬性
XmlElement
xesub1=xmlDoc.CreateElement("title");
xesub1.InnerText="CS從入門到精通";//設置文本節點
xe1.AppendChild(xesub1);//添加到<book>節點中
XmlElement
xesub2=xmlDoc.CreateElement("author");
xesub2.InnerText="候捷";
xe1.AppendChild(xesub2);
XmlElement
xesub3=xmlDoc.CreateElement("price");
xesub3.InnerText="58.3";
xe1.AppendChild(xesub3);
root.AppendChild(xe1);//添加到<bookstore>節點中
xmlDoc.Save("bookstore.xml");
//===============================================
結果為:
<?xml
version="1.0"
encoding="gb2312"?>
<bookstore>
<book
genre="fantasy"
ISBN="2-3631-4">
<title>Oberon's
Legacy</title>
<author>Corets,
Eva</author>
<price>5.95</price>
</book>
<book
genre="李贊紅"
ISBN="2-3631-4">
<title>CS從入門到精通</title>
<author>候捷</author>
<price>58.3</price>
</book>
</bookstore>
2、修改節點:將genre屬性值為「李贊紅「的節點的genre值改為「update李贊紅」,將該節點的子節點<author>的文本修改為「亞勝」。
XmlNodeList
nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes;//獲取bookstore節點的所有子節點
foreach(XmlNode
xn
in
nodeList)//遍歷所有子節點
{
XmlElement
xe=(XmlElement)xn;//將子節點類型轉換為XmlElement類型
if(xe.GetAttribute("genre")=="李贊紅")//如果genre屬性值為「李贊紅」
{
xe.SetAttribute("genre","update李贊紅");//則修改該屬性為「update李贊紅」
XmlNodeList
nls=xe.ChildNodes;//繼續獲取xe子節點的所有子節點
foreach(XmlNode
xn1
in
nls)//遍歷
{
XmlElement
xe2=(XmlElement)xn1;//轉換類型
if(xe2.Name=="author")//如果找到
{
xe2.InnerText="亞勝";//則修改
break;//找到退出來就可以了
}
}
break;
}
}
xmlDoc.Save("bookstore.xml");//保存。
//==================================================
最後結果為:
<?xml
version="1.0"
encoding="gb2312"?>
<bookstore>
<book
genre="fantasy"
ISBN="2-3631-4">
<title>Oberon's
Legacy</title>
<author>Corets,
Eva</author>
<price>5.95</price>
</book>
<book
genre="update李贊紅"
ISBN="2-3631-4">
<title>CS從入門到精通</title>
<author>亞勝</author>
<price>58.3</price>
</book>
</bookstore>
3、刪除
<book
genre="fantasy"
ISBN="2-3631-4">節點的genre屬性,刪除
<book
genre="update李贊紅"
ISBN="2-3631-4">節點。
XmlNodeList
xnl=xmlDoc.SelectSingleNode("bookstore").ChildNodes;
foreach(XmlNode
xn
in
xnl)
{
XmlElement
xe=(XmlElement)xn;
if(xe.GetAttribute("genre")=="fantasy")
{
xe.RemoveAttribute("genre");//刪除genre屬性
}
else
if(xe.GetAttribute("genre")=="update李贊紅")
{
xe.RemoveAll();//刪除該節點的全部內容
}
}
xmlDoc.Save("bookstore.xml");
//===========================================
最後結果為:
<?xml
version="1.0"
encoding="gb2312"?>
<bookstore>
<book
ISBN="2-3631-4">
<title>Oberon's
Legacy</title>
<author>Corets,
Eva</author>
<price>5.95</price>
</book>
<book>
</book>
</bookstore>
4、顯示所有數據。
XmlNode
xn=xmlDoc.SelectSingleNode("bookstore");
XmlNodeList
xnl=xn.ChildNodes;
foreach(XmlNode
xnf
in
xnl)
{
XmlElement
xe=(XmlElement)xnf;
Console.WriteLine(xe.GetAttribute("genre"));//顯示屬性值
Console.WriteLine(xe.GetAttribute("ISBN"));
XmlNodeList
xnf1=xe.ChildNodes;
foreach(XmlNode
xn2
in
xnf1)
{
Console.WriteLine(xn2.InnerText);//顯示子節點點文本
}
}
『柒』 web項目中如何讀取配置文件config.xml
servlet初始化的時候會去讀取web.xml,把這個文件的路徑配置到web.xml里。或者你在web.xml里載入個初始化類,這個類去載入config.xml