為Asp.net應(yīng)用程序設(shè)置構(gòu)建Web服務(wù)
發(fā)表時(shí)間:2023-08-18 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]作者:宋華 一、什么是應(yīng)用程序設(shè)置 應(yīng)用程序設(shè)置通常是指與應(yīng)用程序密切相關(guān)的一系列參數(shù)。在基于窗體的Windows應(yīng)用程序中,應(yīng)用程序設(shè)置主要包括影響應(yīng)用程序布局的位置、尺寸等參數(shù);影響應(yīng)用...
作者:宋華
一、什么是應(yīng)用程序設(shè)置
應(yīng)用程序設(shè)置通常是指與應(yīng)用程序密切相關(guān)的一系列參數(shù)。在基于窗體的Windows應(yīng)用程序中,應(yīng)用程序設(shè)置主要包括影響應(yīng)用程序布局的位置、尺寸等參數(shù);影響應(yīng)用程序外觀的顏色、形狀等參數(shù);此外,還包括應(yīng)用程序的語言、文化等設(shè)置以及數(shù)據(jù)源和連接字符串等等。這些參數(shù)設(shè)置在程序開發(fā)中應(yīng)用廣泛,有的被用來保持應(yīng)用程序的一致性、連續(xù)性,比如保存應(yīng)用程序結(jié)束時(shí)的窗體大小、位置及背景顏色,下次執(zhí)行應(yīng)用程序時(shí)恢復(fù)這些設(shè)置;另一些參數(shù)則使程序代碼更加簡(jiǎn)潔高效,比如保存數(shù)據(jù)庫連接字符串供多次調(diào)用。
與基于窗體的windows應(yīng)用程序不完全相同,基于web的Asp.net應(yīng)用程序有其自身的特殊性,它是面向網(wǎng)絡(luò)的。這決定了asp.net應(yīng)用程序設(shè)置除包括上面的參數(shù)外,還包括,
# 身份驗(yàn)證和授權(quán)等安全機(jī)制
# 網(wǎng)絡(luò)傳輸協(xié)議類型和針對(duì)特定類型文檔的http處理程序
# 事務(wù)處理
# 為所有頁面設(shè)置超時(shí)
# 定制出錯(cuò)頁面來代替默認(rèn)IIS出錯(cuò)頁面
# 會(huì)話和會(huì)話狀態(tài)信息
# 頁面緩存行為
# 自定義及擴(kuò)展
可見,asp.net 應(yīng)用程序設(shè)置參數(shù)類型更為豐富。實(shí)際開發(fā)中,它們不僅被用來提高應(yīng)用程序安全性、高效性,而且易于對(duì)特定用戶實(shí)施管理并可定制需求。
二、為什么要將asp.net應(yīng)用程序設(shè)置外置為web服務(wù)
關(guān)于web服務(wù)的優(yōu)點(diǎn)就不用再提了,媒體鋪天蓋地的宣傳和在許多領(lǐng)域的廣泛應(yīng)用已經(jīng)足夠說明問題。不過這里仍然要強(qiáng)調(diào)的是,web服務(wù)實(shí)際上就是asp.net應(yīng)用程序,只不過重新進(jìn)行了組織。特別地,web服務(wù)為不同應(yīng)用程序之間共享對(duì)象提供了實(shí)現(xiàn)。通過簡(jiǎn)單的引用,你可以在程序中訪問另一程序?qū)崿F(xiàn)的功能,而不僅僅是asp.net中那樣只有通過瀏覽器才能實(shí)現(xiàn)。顯而易見,web服務(wù)也具有一般asp.net應(yīng)用程序所擁有的許多功能和特性。Asp.net和web服務(wù)都有狀態(tài)管理功能就是一個(gè)典型的示例。
然而,將asp.net應(yīng)用程序設(shè)置外置為web服務(wù)有什么優(yōu)點(diǎn)呢?一方面可以從軟件(應(yīng)用程序)可復(fù)用性方面得到答案,試想一想,如果客戶應(yīng)用程序(源)需要使用另一應(yīng)用程序(目標(biāo))的設(shè)置參數(shù),這時(shí),將目標(biāo)應(yīng)用程序設(shè)置配置為web服務(wù),在源應(yīng)用程序中就能夠方便地調(diào)用了,就像在本機(jī)配置了同樣的設(shè)置一樣。另一方面,web服務(wù)(asp.net應(yīng)用程序應(yīng)用)特殊的存儲(chǔ)其應(yīng)用程序設(shè)置的機(jī)制(即下面將講述的web.config文件存儲(chǔ)設(shè)置)使得應(yīng)用程序跨平臺(tái)、跨internet以及應(yīng)用程序的升級(jí)和xcopy部署方式成為可能。
三、存儲(chǔ)asp.net應(yīng)用程序設(shè)置
我們應(yīng)該已經(jīng)知道,基于windows應(yīng)用程序的設(shè)置一般保存在注冊(cè)表中。通過對(duì)注冊(cè)表寫入"鍵值對(duì)",保存特定相應(yīng)的設(shè)置值。然后,通過讀取注冊(cè)表的"鍵值對(duì)",取出相應(yīng)的設(shè)置值。看來,過程本身并不復(fù)雜,加上.Net框架為注冊(cè)表的讀寫提供了豐富的類庫支持,使得操作注冊(cè)表以讀寫應(yīng)用程序設(shè)置更為簡(jiǎn)單(關(guān)于注冊(cè)表讀寫請(qǐng)參見專門的文章,這里就不展開了)。
然而,注冊(cè)表本身是個(gè)相當(dāng)敏感的區(qū)域,對(duì)它的讀寫不可避免地引發(fā)安全隱患,即便在本地主機(jī)上操作也要相當(dāng)慎重,更何況置身于不可預(yù)料用戶數(shù)量的網(wǎng)絡(luò)環(huán)境之下,就更應(yīng)該在公開注冊(cè)表的讀寫操作時(shí)慎之又慎!或者,干脆找別的方法替代!
正是由于這樣的原因,Asp.net應(yīng)用程序設(shè)置除了存儲(chǔ)在注冊(cè)表中外,更多地,通過以下兩種方式來存儲(chǔ):
# Application對(duì)象
# Web.config文件
四、使用Application對(duì)象存儲(chǔ)應(yīng)用程序設(shè)置
對(duì)我們來說,Application對(duì)象相當(dāng)熟悉。它是asp.net從asp中保留下來的、用以簡(jiǎn)化應(yīng)用程序狀態(tài)管理的兩個(gè)對(duì)象之一(另一個(gè)是Session對(duì)象)。作為一個(gè)asp.net應(yīng)用程序,web服務(wù)就象其他任何web應(yīng)用程序一樣,也能夠訪問application對(duì)象。
在asp.net中,application對(duì)象可視為高級(jí)語言中的全局變量。它在應(yīng)用程序中保持一致,以實(shí)現(xiàn) ASP.NET 應(yīng)用程序中多個(gè)會(huì)話和請(qǐng)求之間的全局信息共享。(有必要提一下,ASP.NET 應(yīng)用程序是單個(gè) Web 服務(wù)器上的某個(gè)虛擬目錄及其子目錄范圍內(nèi)的所有文件、頁、處理程序、模塊和代碼的總和。)
有別于普通全局變量的是,asp.net應(yīng)用程序狀態(tài)Application對(duì)象在客戶端第一次從某個(gè)特定的 ASP.NET 應(yīng)用程序虛擬目錄中請(qǐng)求任何 URL 資源時(shí)創(chuàng)建。Web 服務(wù)器上的每個(gè) ASP.NET 應(yīng)用程序都要?jiǎng)?chuàng)建一個(gè)單獨(dú)的實(shí)例。然后通過此Application對(duì)象公開對(duì)每個(gè)實(shí)例的引用。
這樣,application對(duì)象適宜被用來保存需要不同用戶共享的數(shù)據(jù),記載關(guān)于應(yīng)用程序的設(shè)置情況,以使其能夠被運(yùn)行于同一個(gè)web應(yīng)用程序中的所有代碼訪問,進(jìn)一步,將包含application對(duì)象的方法外置為web服務(wù),以在應(yīng)用程序中共享對(duì)象并操作應(yīng)用程序設(shè)置值。有關(guān)應(yīng)用程序訪問次數(shù)的狀態(tài)編程,讀取遠(yuǎn)程數(shù)據(jù)庫的互操作編程等都通過以此類似的方式來實(shí)現(xiàn)應(yīng)用程序的設(shè)置共享。
下面的代碼使用application對(duì)象,記載特定應(yīng)用程序的訪問次數(shù),并將方法外置為web服務(wù)供應(yīng)用程序調(diào)用:
[WebService(Namespace="http://www.thjx.com")]
public class Application : System.Web.Services.WebService
{
/// <summary>
/// 返回應(yīng)用程序被訪問次數(shù)
/// </summary>
[WebMethod(Description="返回特定應(yīng)用程序被訪問的次數(shù)")]
public int GetAppAccessCount(string key)
{
if(Application[key]==null)
{
Application.Lock();//鎖定Application對(duì)象以同步訪問
Application[key]=1;
Application.UnLock();//取消鎖定
}
else
{
Application.Lock();
Application[key]=Int32.Parse(Application[key].ToString())+1;
Application.UnLock();
}
return (int)Application[key];
}
}
方法GetAppAccessCount(string key)在特定應(yīng)用程序被執(zhí)行一次后訪問次數(shù)遞增1個(gè)單位量,并保存在應(yīng)用程序設(shè)置變量中,下一次來自任何用戶的訪問將在這個(gè)變量的基礎(chǔ)上遞增該設(shè)置。
五、使用Web.congfig文件存儲(chǔ)應(yīng)用程序設(shè)置
從上面可以知道,asp.net應(yīng)用程序需要配置很多的特殊設(shè)置,包括為所有頁面設(shè)置超時(shí)、定制出錯(cuò)頁面來代替默認(rèn)IIS出錯(cuò)頁面以及安全設(shè)置和授權(quán)級(jí)別設(shè)置等。看上去,這么多類型的設(shè)置一定很麻煩,幸運(yùn)地是,asp.net結(jié)束了需要進(jìn)行手工配置的歷史,那就是將設(shè)置保存在Web.config文件中。這是不同于此前提到的使用注冊(cè)表或application對(duì)象保存應(yīng)用程序設(shè)置的另一種保存應(yīng)用程序設(shè)置的方法。由于web.config文件存在于應(yīng)用程序根目錄下,以這種方式保存的應(yīng)用程序設(shè)置將使應(yīng)用程序跨平臺(tái)使用和伸縮性大大增強(qiáng)。
使用web.config文件存儲(chǔ)應(yīng)用程序設(shè)置有很多優(yōu)點(diǎn),web.config實(shí)際上是一個(gè)純文本文件,顯然,存儲(chǔ)在純文本文件中的配置信息非常容易修改,而且,不象傳統(tǒng)的asp,任何對(duì)配置設(shè)置的修改不需要重新啟動(dòng)web服務(wù)器,就可以立即應(yīng)用于當(dāng)前的web應(yīng)用程序;同時(shí),設(shè)置好的配置被自動(dòng)應(yīng)用于當(dāng)前文件夾和它所有的子文件夾,使真正兼容主機(jī)的xcopy成為可能,我們只需要復(fù)制另一個(gè)IIS虛擬目錄中的所有web應(yīng)用程序文件即可實(shí)現(xiàn)應(yīng)用程序部署;另外,一些特定任務(wù)的配置如基于表單的授權(quán)只有通過使用web.config文件才能實(shí)現(xiàn)。
這里,有必要簡(jiǎn)要說說web.config文件的構(gòu)造。web.config文件是標(biāo)準(zhǔn)的xml文件,遵循格式正確的xml文檔的所有規(guī)范。它包括多個(gè)部分,每一部分處理一個(gè)特殊的任務(wù)。web.config文件由許多小節(jié)組成,包括驗(yàn)證小節(jié)、安全性小節(jié)、錯(cuò)誤處理小節(jié)和web服務(wù)小節(jié)。并以鍵值對(duì)的形式保存應(yīng)用程序配置信息。
作為標(biāo)準(zhǔn)的xml文檔,web.config文件的根元素是<configuration>,它包含一個(gè)子元素<system.web>,而后者又包括許多配置部分。Web.config文件包含許多標(biāo)記,每一個(gè)標(biāo)記對(duì)應(yīng)一個(gè)所謂的"部分(section)"。如,表示身份驗(yàn)證的Authentication、表示授權(quán)的Authorization、定制錯(cuò)誤的CustomErrors、會(huì)話設(shè)置SessionState等等。
盡管web.config文件為用戶自定義提供了很大的空間,我們可能仍然需要一些用戶設(shè)置。appSettings部分就是用來滿足這項(xiàng)要求的,請(qǐng)記住這部分并不在<system.web ></system.web>標(biāo)記中,而是單獨(dú)存放在<configuration></configuration>標(biāo)記中,數(shù)據(jù)庫連接字符串、email服務(wù)器地址和日志文件存放路徑,通常頁可以放在這部分。
下面的代碼片段是一個(gè)web.config文件的設(shè)置小節(jié),該小節(jié)定義了應(yīng)用程序設(shè)置,即appSettings小節(jié),它包含了數(shù)據(jù)庫連接字符串和另一個(gè)用戶設(shè)置LogFilePath鍵值對(duì):
<configuration>
<appSettings>
<add key="Conn" value="server=(local);uid=sa;pwd=;database=myDB" />
<add key="logFilePath" value="c:\mylogs" />
</appSettings>
</configuration>
.Net框架支持asp.net應(yīng)用程序訪問應(yīng)用程序設(shè)置。其ConfigurationSettings 類提供對(duì)指定配置小節(jié)中配置設(shè)置的訪問。該類的公共屬性ConfigurationSettings.AppSettings 屬性可獲取 <appSettings> 元素配置節(jié)中的配置設(shè)置,該屬性是一個(gè)NameValueCollection,它包含配置設(shè)置的名稱/值對(duì):
public static NameValueCollection.AppSettings {get;}
下面的web服務(wù)方法用于獲取應(yīng)用程序配置設(shè)置:using System.Configuration;
[WebMethod]
public string GetAppSetting(string key)
{
return ConfigurationSettings.AppSettings[key];
}
注意,AppSetting屬性是只讀的,要想修改應(yīng)用程序設(shè)置,必須編輯web.config文件。同時(shí),如果key鍵并不存在于web.config文件中,讀取AppSettings屬性將引發(fā)錯(cuò)誤。
ConfigurationSettings 類還提供了一個(gè)公共方法ConfigurationSettings.GetConfig 用于返回用戶定義的配置節(jié)的配置設(shè)置。
public static object GetConfig(string sectionName);
其中,參數(shù)sectionName 表示要讀取的配置節(jié)。下面的web服務(wù)方法用于獲取用戶定義配置的指定鍵值:
[WebMethod]
public string GetConfig(string key)
{
NameValueCollection nv=new NameValueCollection();
//實(shí)例化NameValueCollection 類對(duì)象
nv=(NameValueCollection)ConfigurationSettings.GetConfig("appSettings");
//返回用戶定義的配置節(jié)的設(shè)置
return nv[key].ToString();
//返回特定鍵值
}
六、消費(fèi)"實(shí)現(xiàn)asp.net應(yīng)用程序設(shè)置的web服務(wù)"
你可以編寫 Web應(yīng)用程序、Windows桌面應(yīng)用程序或Web服務(wù)等應(yīng)用程序來消費(fèi)已經(jīng)創(chuàng)建的應(yīng)用程序設(shè)置web服務(wù)。實(shí)現(xiàn)方式同任何標(biāo)準(zhǔn)的web服務(wù)一樣,沒有什么特別之處,應(yīng)該說很簡(jiǎn)單,這里就不展開講解了。
參考資料:《Professional Xml For .Net Developers》、《Professional Asp.net Web Services》