版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第5章Web應用和數(shù)據(jù)管理5.1Web應用的結構
5.2Web應用模型
5.3狀態(tài)管理
5.4將用戶數(shù)據(jù)存到服務器文件系統(tǒng)
5.5高速緩存
5.6圖形數(shù)據(jù)的生成和表示
5.7討論傳統(tǒng)桌面應用具有唯一的入口,整個應用被編譯成獨立的可執(zhí)行文件。一個應用可包含多個類和文件,并由一個工程文件組織在一起成為一個定義良好的工程域。另一方面,Web應用包含很多頁面和其他文件,可以通過任意頁面進入這個Web應用,即使最常用的入口是主頁面或默認頁面。為了更好的滿足交互性,Web應用經(jīng)常是事件驅(qū)動的。由于Web服務和HTTP協(xié)議是無狀態(tài)的,所以Web應用中的狀態(tài)管理問題很關鍵,并且需要采取的技術和面向?qū)ο筌浖_發(fā)中的技術完全不同。
本章主要關注利用Internet上提供的已有Web服務以及應用域創(chuàng)建的一些本地構件來構建Web應用。
一個ASP.NetWeb站點應用包含該應用的目錄以及子目錄中所有文件,其中有的目錄和文件是系統(tǒng)生成的,其他是開發(fā)者創(chuàng)建的。但是開發(fā)者可以編輯所有的文件,包括那些系統(tǒng)生成的文件。5.1Web應用的結構5.1.1Web應用的構件
ASP.NetWeb站點應用通常包含下面幾種類型的文件和構件,其中有些是必需的,有些則是可選的。
(1)ASPX文件:ASPX文件采用Web格式,用于創(chuàng)建用戶與程序交互的GUI頁面。當ASPXWeb站點應用被創(chuàng)建時,文件Default.aspx也被生成。一個ASP.NetWeb站點至少有一個ASPX文件,開發(fā)者也可以添加更多的ASPX文件。
(2)ASCX文件:ASCX文件都通過服務器端腳本或頁面后臺代碼創(chuàng)建HTML頁面中的用戶控件。用戶控件不能創(chuàng)建完整的頁面,但是它可以在一個或多個ASPX頁面中添加(用戶控件)可重用項。
(3)Web.config文件:它包含模式定義、訪問控制、參數(shù)化應用的行為等配置設置。
(4)Global.asax全局應用類:包含對全局事件的事件處理,例如應用或新的會話的啟動。在創(chuàng)建應用時,此文件放在其根目錄下。
(5)DLL(動態(tài)鏈接庫):它包含Windows環(huán)境下的通用庫函數(shù),并與.exe文件有相同的格式。在任何時候,它們都可以被計算機上運行的其他程序調(diào)用,例如,允許另外一個程序與特定設備,如打印機和鍵盤調(diào)用,通信程序通常被打包成DLL程序。支持特定設備操作的DLL文件被稱為設備驅(qū)動程序。
(6)C#文件或者.cs文件用于頁面后臺的事件處理程序,用來處理諸如用戶輸入(鼠標點擊)、程序回滾以及異常等事件。
(7)XHTML頁面:是ASPX頁面的標記頁面。XHTML頁面可由ASPX設計頁面生成,也可由開發(fā)者創(chuàng)建。另一方面,ASPX頁面可由XHTML頁面生成。XHTML頁面必可包含C#腳本。
應用的根目錄通常包含Default.aspx、Global.asax文件、Web.config文件,以及任何其他頂層ASPX和ASCX文件。ASP.NetWeb站點應用可創(chuàng)建多個子目錄分類存儲應用生成的文件。通常來說,這些子目錄包括:
(1)Bin:包含可執(zhí)行碼和DLL文件;
(2)App_Code:包含程序源代碼,例如C#程序;
(3)App_Data:存儲XML文件和數(shù)據(jù)庫文件;
(4)App_WebReferences:存儲添加在應用中的Web服務的引用。
最簡單的Web應用只包含一個文件,它是提供用戶GUI的ASPX文件。ASPX文件的計算能力是有限的。對于更復雜的應用需要多個文件,這些文件組織成為一個樹形圖,如圖5.1。
圖5.1ASP.NetWeb站點應用的組織全局文件定義之后必須放在根目錄下,并且任何應用只能定義一個全局文件。任何目錄下都可以定義任意數(shù)目的ASPX文件、ASCX文件和DLL文件。每個目錄只定義一個Web.config文件。因為Web.config文件和應用的安全性有關,因此我們重點關注它。
ASP.Net可以創(chuàng)建允許進行xcopy安裝的軟件,也就是,可通過拖拽軟件文件夾到用戶選定的安裝位置進行安裝,刪除時也只需要刪除該文件夾。只要把Web.config文件放在應用軟件所在的目錄中,而不是放在Windows系統(tǒng)注冊表中,就會支持XCOPY機制。Web.config文件的另一個意圖是參數(shù)化應用的行為,即不用修改或者重新編譯源代碼就可修改行為。它本質(zhì)上是一種基于策略的計算。基于策略的計算是SOA的常見特點,但是,它目前是比較活躍的研究領域,因此本書不詳細討論。
Web應用中的每個子目錄都可包含Web配置文件,都起名為Web.config。Web.config文件中的設置應用于它所在的目錄和所有子目錄。一個目錄中Web.config文件中的設置優(yōu)先于(覆蓋)父目錄中的設置。用戶可以創(chuàng)建子目錄的Web.config文件,并用它們控制子頁的設置。圖5.1是一個應用域中的文件和這些文件的組織的例子。
Web.config文件受IIS保護,所以客戶端不能通過瀏覽器瀏覽。任何訪問文件的嘗試都會收到拒絕訪問的出錯信息。
Web.config采用XML格式并作為簡單的文本文件存儲。任何文本編輯器或者XML解析器都可創(chuàng)建編輯Web.config文件。Web.config包含兩部分數(shù)據(jù),下面是它的基本框架:
<configuration>
<appSettings>
<!applicationsettingvaluesgohere>
</appSettings>
<system.web>
<!ASP.Netconfigurationsettingsgohere>
<system.web>
<configuration>
Web.config文件中的<appSetting>元素包含應用中的一些特定值,例如,應用訪問數(shù)據(jù)庫時需要的鏈接字符串,它允許開發(fā)者參數(shù)化應用。下面的代碼將鏈接SQL數(shù)據(jù)庫的字符串硬編碼到C#程序中:
SqlDataAdapteradapter=newSqlDataAdapter("select*fromnamewhereyear=2008,"server=myServer;database=myDatabase;IntegratedSecurity=SSPI;UserID=myID;Password=MyPassWord");
DataSetrefDataSet=newDataSet();
adapter.Fill(refDataSet);這樣,如果要修改,例如密碼改變,會導致C#代碼被修改并重新編譯。最好的方式是在<appSetting>中定義鏈接字符串,這樣使用不同的數(shù)據(jù)庫時,不需要修改代碼。下面的Web.config文件將和服務器相關的值放入<appSetting>元素:
<configuration>
<appSettings>
<addkey="MyConnectionString"value="server=myServer;database=myDatabase;
IntegratedSecurity=SSPI;UserID=myID;Password=MyPassWord"/>
</appSettings>
</configuration>
這樣,C#代碼使用路徑ConfigurationSettings.appSettings和參數(shù)(關鍵碼)MyConnectionString訪問Web.config文件中的鏈接字符串,就像已在MSDN庫中定義的字符串。
StringrefString=ConfigurationSettings.appSettings[MyConnectionString];SqlDataAdapteradapter=newSqlDataAdapter("select*fromnamewhereyear=2008",
refString);DataSetrefDataSet=newDataSet();
adapter.Fill(refDataSet);5.1.2服務控件
ASPX頁面中的圖形用戶界面(GUI)可以通過工具箱中的服務控件來實現(xiàn)。服務控件是.Net類庫中控制類的對象。這些控件是ASPX頁面的組成部分??丶梢越邮蛰斎氩⒂纱思ぐl(fā)事件,這樣,我們可以給控件編寫事件處理程序并以事件驅(qū)動方式處理輸入。圖形化設計視圖中的控件也可以顯示成XHTML格式,可以發(fā)送到客戶端瀏覽器以顯示為Web頁面。ASP.Net提供了三種服務控件:Web控件、HTML控件、由用戶自己定義的類創(chuàng)建的用戶控件。
(1)HTML控件是在服務器端生成相當于HTML構件的對象,因此所有的HTML函數(shù)都可以在ASPX應用中處理。通過事件,處理程序和控件連接起來,所以,輸入控制或數(shù)據(jù)都能迅速被處理。
(2)Web控件提供了傳統(tǒng)的HTML頁面中不存在的構件。這些構件比HTML控件功能更強大。
(3)用戶控件:HTML控件和Web控件通過.Net類庫中的類提供。如想使用庫中沒有提供的控件,可以創(chuàng)建用戶控件(對象)。用戶控件通過單獨的ASCX頁面定義,頁面包含服務器端腳本或頁面支持的后臺代碼。由于用戶控件被保存為單獨的XHTML文件,所以修改控件時不需要修改相關的ASPX頁面。一個用戶控件可以被多個ASPX頁面共享。
ASPX頁面和ASCX頁面有兩種不同的視圖:(圖形化)設計視圖和(XHTML)源碼視圖。可以用兩種視圖開發(fā)頁面。圖5.2顯示的是ASPX頁面的設計視圖。Web應用包含兩個ASPX頁面:Sender.aspx和Receiver.aspx。此應用中使用Web服務Encryptor進行加密和解密。
圖5.2一個ASPX應用的設計視圖如果在文本框中輸入普通文本消息,點擊“EncryptNow”按鈕,加密信息就就會顯示出來。例如鍵入“MypasswordisSuperMan1”,“EneryptedMessage”就顯示“箣軈澨?蹧???竭???Ⅴ?脫(因為加密,所以顯示亂碼)”。如果點擊按鈕“SendtoReceiver”,加密信息會發(fā)送到接收頁面。接收頁面會自動打開。如果沒有自動打開,則可以返回到應用,選擇“Receiver.aspx”頁面,就會執(zhí)行應用(不需要調(diào)試即開始)。點擊按鈕“DecryptNow”,就會看見原始信息“MypasswordisSuperMan1”。下面給出ASPX頁面的源碼視圖。
<%@PageLanguage="C#"Debug="True"AutoEventWireup="true"CodeFile="Sender.aspx.cs"Inherits="Default"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"/TR/xhtml1/DTD/xhtml1transitional.dtd">
<htmlxmlns="/1999/xhtml">
<headrunat="server"><title>EncryptionSender</title>
</head>
<body>
<formid="form1"runat="server">
<p>Pleasetypeyourmessageinthetextbox</p>
<div>
<asp:TextBoxID="txtInput"runat="server"Width="616px">Pleaseentertexthere
</asp:TextBox></div>
<asp:ButtonID="btnEncrypt"runat="server"onclick="btnEncryptClick"
Text="EncryptNow"/>
<br/>
<asp:LabelID="lblEncryptedMessage"runat="server"Text="EncryptedMessage"></asp:Label>
<br/>
<asp:ButtonID="btnSend"runat="server"onclick="btnSendClick"Text="SendtoReceiver"/>
<br/></form>
</body>
</html>
XHTML的源碼視圖包含兩個HTML控件:<headrunat=“server”>和<formrunat=“server”>,任何包含屬性runat=“server”的HTML元素都是HTML控件。
XHTML的源碼視圖包含兩個Web控件:
<asp:Buttonrunat=“server”>和<asp:Lablerunat=“server”>,任何包含限定符asp和屬性runat=“server”的元素都是Web控件。關于XML和XHTML的定義,請參考第4章。
為了使這個例子可運行,我們需要以Web引用的方式把Encryptor服務添加到應用中。服務的網(wǎng)址為:
/WSRepository/Service/Encryption/Service.asmx
Sender.aspx頁面的后臺C#代碼如下:
publicpartialclassDefault:System.Web.UI.Page{
protectedvoidPageLoad(objectsender,EventArgse){}
protectedvoidbtnEncryptClick(objectsender,EventArgse){
//importremoteWebservicetodothedifficultpartofthework
Encryptor.ServiceprxyEncrypt=newEncryptor.Service();
//Takethemessagefromthetextbox
stringmsg1=txtInput.Text;
//CalltheEncryptionmethodintheWebservice
stringmsgEncrypted=prxyEncrypt.Encrypt(msg1);
//Displayencryptedmessageatthepositionofthelabel
lblEncryptedMessage.Text=msgEncrypted;
//SavetheencodedmessageintoaSessionVariable‖,sothat
//theReceiver.aspxpagecanretrievethemessage
Session["msgEncoded"]=(object)msgEncrypted;
}
protectedvoidbtnSendClick(objectsender,EventArgse){
Response.Redirect("Receiver.aspx");
}
}
應用中的第二個ASPX頁面是Recerver.aspx,頁面的XHTML源碼如下:
<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Receiver.aspx.cs"Inherits="Receiver"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""/TR/xhtml1/DTD/xhtml1transitional.dtd">
<htmlxmlns="/1999/xhtml">
<headrunat="server">
<title>EncryptionReceiver</title>
</head>
<body>
<formid="form1"runat="server">
<div>Themessagereceived</div>
<asp:LabelID="lblMessageReceived"runat="server"></asp:Label>
<br/>
<br/><asp:ButtonID="btnDecrypt"runat="server"onclick="btnDecrypt_Click"
Text="DecrptNow"/><br/>
<asp:LabelID="lblMessageDecrypted"runat="server"Text="DecryptedMessage"></asp:Label>
</form>
</body></html>
Receiver.aspx頁面的后臺C#代碼如下:
publicpartialclassReceiver:System.Web.UI.Page{
protectedvoidPageLoad(objectsender,EventArgse){
lblMessageReceived.Text=(string)Session["msgEncoded"];
}
protectedvoidbtnDecryptClick(objectsender,EventArgse){
//importremoteWebservicetodothedifficultpartofthework
Encryptor.ServiceprxyDecrypt=newEncryptor.Service();
//Takethemessagefromthesessionvariableusingthesameindexstring
stringmsg1=(string)Session["msgEncoded"];
//Checkifthesessionvariablecontainsanydata.
if(Session.Count==0){
//(Session.Count==0)meansnodataisstoredbythesender
lblMessageDecrypted.Text="NoMessagetoDisplay";
}
else{
//CalltheDecryptionmethodintheWebservice
stringdecrypted=prxyDecrypt.Decrypt(msg1);
//Displaythedecryptedmessageatthelabel
lblMessageDecrypted.Text=decrypted;
}
}
}通過組裝GUI設計頁面和C#頁面,我們就得到一個可運行的應用。
這是HTML控件和Web控件的另一個例子。下面給出了常用的HTML控件列表:
<buttonrunat="server">HtmlButton<inputtype="button"runat="server">HtmlInputButton<inputtype="reset"runat="server">HtmlInputButton<inputtype="submit"runat="server">HtmlInputButton<inputtype="checkbox"runat="server">HtmllnputcheckBox<inputtype="file"runat="server">HtmlInputFile<inputtype="hidden"runat="server">HtmlInputHidden<inputtype="image"runat="server">HtmlInputImage<inputtype="radio"runat="server">HtmlInputRadioButton<inputtype="password"runat="server">HtmlInputText<inputtype="text"runat="server">HtmlInputText<arunat="server">tmlAnchor<formrunat="server">HtmlForm<selectrunat="server">HtmlSelect<tablerunat="server">HtmlTable<tdrunat="server">HtmlTableCell<thrunat="server">HtmlTableCell<trrunat="server">HtmlTableRow<textarearunat="server">HtmlTextArea<imgrunat="server">HtmlImage
.Net框架類庫(FCL,FrameworkClassLibrary)實現(xiàn)了許多Web控件,包括下面幾組控件:
●按鈕控件,用于創(chuàng)建ASPX頁面中各種類型的按鈕,如前面的例子所示。
●日歷控件,在ASPX頁面中添加交互式日歷。
●數(shù)據(jù)綁定控件,使用數(shù)據(jù)綁定顯示來自數(shù)據(jù)庫或其他數(shù)據(jù)源的信息。
●列表控件,顯示列表項。
●簡單控件,將簡單HTML控件包裝成Web控件。5.1.3用戶控件
為了說明用戶控件的應用,我們給發(fā)送頁添加一個新的特征,在“SendtoReceiver”按鈕下顯示日期和時間。用戶控件可通過下列步驟實現(xiàn):
(1)選擇VisualStudio菜單命令Web站點→添加新項…
(2)在彈出的窗口中選擇Web用戶控件。
(3)把新項命名為SenderDateTime.ascx,點擊添加。用戶控件將會出現(xiàn)在應用程序的SolutionExplorer中,如圖5.3所示。圖5.3用戶控件被添加到Solution中(4)雙擊文件名SenderDateTime.ascx打開文件,出現(xiàn)“source”視圖,在頁面中添加兩個名為1b1DateMsg和1blDate的標簽,如下所示。
<%@ControlLanguage="C#"AutoEventWireup="true"CodeFile="SenderDateTime.
ascx.cs"Inherits="SenderDateTime"%>
<asp:LabelID="lblDateMsg"runat="server"Text="Thedateandtimeare"></asp:Label>
<asp:LabelID="lblDate"runat="server"Text=""></asp:Label>
(5)點擊“design”標簽,轉換到設計視圖,在圖形視圖中查看標簽。
(6)雙擊頁面的空白區(qū)域打開C#編碼頁,添加下列C#代碼。
publicpartialclassSenderDateTime:System.Web.UI.UserControl{
protectedvoidPageLoad(objectsender,EventArgse)
{
Stringdate=DateTime.Now.ToLongDateString();
Stringtime=DateTime.Now.ToLongTimeString();this.lblDate.Text=date+","+time;
}
}現(xiàn)在,我們創(chuàng)建了用戶控件。下來,我們需要將用戶控件與需要控制的ASPX頁面連接。要連接Sender.aspx頁,需要打開XHTML源代碼視圖,通過添加下面代碼中的第一行來注冊用戶控件:
<%@RegisterTagPrefix="myControl"TagName="SenderDateTime"
src="SenderDateTime.ascx"%>
然后,將下面一行代碼放到Sender.aspx頁面中需要顯示日期和時間的位置:<myControl:SenderDateTimeID="SenderDateTime"runat="server"/>
下面給出添加了用戶控件的Sender.aspx頁面的完整的XHTML代碼,黑體部分是添加的代碼。
<%@PageLanguage="C#"Debug="True"AutoEventWireup="true"CodeFile="
Sender.
aspx.cs"Inherits="_Default"%>
<%@RegisterTagPrefix="myControl"TagName="SenderDateTime"src="SenderDateTime.ascx"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN
"/TR/xhtml1/DTD/xhtml1transitional.dtd">
<htmlxmlns="/1999/xhtml">
<headrunat="server">
<title>EncryptionSender</title>
</head><body>
<formid="form1"runat="server">
<p>Pleasetypeyourmessageinthetextbox</p>
<div>
<asp:TextBoxID="txtInput"runat="server"Width="616px">
Pleaseentertexthere</asp:TextBox>
</div>
<asp:ButtonID="btnEncrypt"runat="server"onclick="btnEncryptClick":
Text="EncryptNow"/>
<p/>
<asp:LabelID="lblEncryptedMessage"runat="server"Text="EncryptedMessage"></asp:Label>
<p/>
<asp:ButtonID="btnSend"runat="server"onclick="btnSendClick"
Text="SendtoReceiver"/>
<p/>
<myControl:SenderDateTimeID="SenderDateTime"runat="server"/>
</form>
</body>
</html>上述例子說明在ASPX頁面中如何創(chuàng)建和包含用戶控件。顯然,這項功能通過Web控件“Label”,并在Sender.aspx頁面后臺直接添加C#代碼就很容易實現(xiàn)。用戶控件的主要優(yōu)點是它的重用性。同一個用戶控件可被多個ASPX頁共享,而服務控件和它的后臺代碼綁定到一個ASPX頁面,不能被共享。在上面的例子中,可為Receiver.aspx頁添加相同的用戶控件。5.1.4Web應用配置
VisualStudio開發(fā)環(huán)境將所有文件,包括配置文件,放在一個(根)目錄下的應用域中。如果配置文件放在應用域外的系統(tǒng)注冊表中,則安裝程序必需把配置放在正確的地方。這樣,創(chuàng)建的.Net應用就很容易安裝和卸載??梢酝ㄟ^拖曳應用文件夾的方式將應用安裝到文件系統(tǒng)的任何位置,卸載時只需刪除這個文件夾即可。
ASP.Net應用的配置文件Web.config是XML文本文件,創(chuàng)建應用時其配置文件自動生成??梢允褂萌魏螛藴实奈谋揪庉嬈骰騒ML解析器讀寫配置文件。配置文件不會被鎖定,應用執(zhí)行時也可以對它進行編輯。ASP.Net可以發(fā)現(xiàn)配置文件的改變,并對被變更影響的Web資源自動實施新的配置項,服務器端不需要重新啟動。任何時候,層次結構中的配置文件一旦修改,層次配置的設置都會自動重新計算并重新載入。ASP.NetWeb應用服務器的多個目錄下都會有配置文件,多個配置文件都命名為Web.config。
配置文件的作用范圍是它所在的目錄以及它的子目錄。子目錄中的配置文件除了可以應用從父目錄繼承的配置信息外,還可以覆蓋或修改父目錄中定義的設置。通過配置IIS阻止直接瀏覽訪問配置文件,ASP.Net保護配置文件不受外來訪問。任何瀏覽器試圖直接訪問配置文件,都將返回HTTP訪問錯誤403(禁止)。下面的文件是之前討論的加密例子中的Web.config。
<?xmlversion="1.0"?>
<!
Note:Asanalternativetohandeditingthisfileyoucanusethe
Webadmintooltoconfiguresettingsforyourapplication.Use
theWebsite>Asp.Net?ConfigurationoptioninVisualStudio.
Afulllistofsettingsandcommentscanbefoundin
machine.config.commentsusuallylocatedin
/Windows/Microsoft.Net?/Framework/v2.x/Config
><configuration>
<configSections>
<sectionGroup>
…
</sectionGroup>
</configSections>
<appSettings>
<addkey="Encryptor.Service"value="/WSRepository/
Services/Encryption/Service.asmx"/>
</appSettings>
<system.Web>
<!
Setcompilationdebug="true"toinsertdebugging
symbolsintothecompiledpage.Becausethis
affectsperformance,setthisvaluetotrueonly
duringdevelopment.
>
<compilationdebug="true">
<assemblies>
…
</assemblies>
</compilation>
<!
The<authentication>sectionenablesconfiguration
ofthesecurityauthenticationmodeusedby
ASP.Net?toidentifyanincominguser.
>
<authenticationmode="Windows"/>
<!
The<customErrors>sectionenablesconfiguration
ofwhattodoif/whenanunhandlederroroccurs
duringtheexecutionofarequest.Specifically,
itenablesdeveloperstoconfigurehtmlerrorpages
tobedisplayedinplaceofanerrorstacktrace.
<customErrorsmode="RemoteOnly"defaultRedirect="GenericErrorPage.htm">
<errorstatusCode="403"redirect="NoAccess.htm"/>
<errorstatusCode="404"redirect="FileNotFound.htm"/>
</customErrors>
>
<pages>
<controls>
…
</controls>
</pages>
<httpHandlers>
…
</httpHandlers>
<httpModules>
…
</httpModules>
</system.Web>
<system.codedom>
<compilers>
…
</compilers>
</system.codedom>
<!
Thesystem.WebServersectionisrequiredforrunningASP.Net?AJAX
underInternetInformationServices7.0.Itisnotnecessary
forpreviousversionofIIS.
>
<system.WebServer>
<validationvalidateIntegratedModeConfiguration="false"/>
<handlers>
<removename="WebServiceHandlerFactoryIntegrated"/>
<removename="ScriptHandlerFactory"/>
<removename="ScriptHandlerFactoryAppServices"/>
<removename="ScriptResource"/>
<addname="ScriptHandlerFactory"verb="*"path="*.asmx"/>
<addname="ScriptHandlerFactoryAppServices"verb="*"/>
<addname="ScriptResource"preCondition="integratedMode"/>
</handlers>
</system.WebServer>
<runtime>
<assemblyBindingxmlns="urn:schemasmicrosoftcom:asm.v1">
<dependentAssembly>
…
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
下面詳細介紹一下Web.config文件。它是一個XML文件,包含許多元素。根元素是<configuration>,第一層子元素是配置文件的主要部分。
(1)<configSections>部分:包含配置文件中出現(xiàn)的各部分的聲明,類似于程序中的變量聲明,我們需要在程序的開始部分聲明程序中使用的所有變量。
(2)<appSettings>部分:保存應用中特定的值(字符串),它們在運行過程可以被讀取。
(3)<system.Web>部分:保存系統(tǒng)使用的配置(ASP.Net)。
(4)<system.codedom>部分:保存應用中使用的每一種語言編譯時使用的配置。
(5)<system.WebServer>部分:保存Web服務或Web應用所在的Web服務器使用的配置。
(6)<runtime>部分:保存運行時系統(tǒng)相關的綁定、部署和身份驗證的配置。
ASP.Net配置系統(tǒng)是可擴展的,可以定義新的配置部分,編寫程序讀取特定部分,運用數(shù)據(jù)作決策。因此,Web.config文件可以用來支持基于策略的計算。如果你喜歡,也可以使用ASP.NetWebSite管理工具編輯Web.config文件,而不是直接使用文本工具編輯XML元素。在ASP.Net菜單中,選擇Website→ASP.NetConfigeration,就可以定義和編輯你關心的所有部分。
Web.config文件的部分和子部分在后面需要使用它們的章節(jié)中會繼續(xù)介紹。例如,在研究安全機制的開發(fā)時,會介紹<authentication>和<authorization>元素。5.1.5全局應用類
ASP.Net提供全局應用類Glabal.asax,它包含負責處理全局事件的處理程序。全局變量可以通過形如Application[“index”]的應用狀態(tài)來使用,它提供了對象數(shù)組存儲全局信息。想要在應用中添加全局應用類,可右擊應用文件夾,選擇“AddNewItem…”,然后選擇“GlobalApplicationClass”,Global.asax將會被添加到應用的根目錄下。打開文件,里面包含了帶有事件處理接口的模板。
下面的代碼是添加幾個簡單事件處理的全局應用類的例子。
<%@ApplicationLanguage="C#"%><scriptrunat="server">
voidApplicationStart(objectsender,EventArgse){
//Codethatrunsonapplicationstartup
Application["SessionCounter"]=0;
}
voidApplicationEnd(objectsender,EventArgse){
//Codethatrunsonapplicationshutdown
Response.Write("<hr/>TheWebsitewaslastvisitedon"
+DateTime.Now.ToString());
}
voidApplicationError(objectsender,EventArgse){
//Codethatrunswhenanunhandlederroroccurs
}
voidSessionStart(objectsender,EventArgse){
//Codethatrunswhenanewsessionisstarted
Int32count=(Int32)Application["SessionCounter"];
count++;
Application["SessionCounter"]=count;
}
voidSessionEnd(objectsender,EventArgse){
//Codethatrunswhenasessionends.
//Note:TheSessionEndeventisraisedonlywhenthesessionstate
//modeissettoInProcintheWeb.configfile.Ifsessionmodeis
//settoStateServerorSQLServer,theeventisnotraised.
Int32count=(Int32)Application["SessionCounter"];
count;
Application["SessionCounter"]=count;
}
</script>
Web應用可以被多個用戶同時訪問。每次訪問都打開新的會話。這些事件處理的作用是跟蹤有多少個會話被同時打開。
在事件處理Application_Start()中,將應用狀態(tài)變量Application[“SessionCounter”]初始化為0。當啟動應用時,這個事件處理被自動調(diào)用。
在事件處理Session_Start()中,增加狀態(tài)變量Application[“SessionCounter”]的值,當新的會話開始時,這個事件處理被自動調(diào)用。在事件處理Session_End()中,減少狀態(tài)變量Application[“SessionCounter”]的值,當會話結束時,這個事件處理被自動調(diào)用。
這個實現(xiàn)中,應用重新啟動時,計數(shù)器初始化為0。如果想保留打開會話的總數(shù),可以使用另外一個應用狀態(tài)變量Application[“TotalSessions”]。將此變量的值保存在包含Application_End()事件處理的硬盤文件中,在Application_Start()事件處理中恢復該變量的值。關于應用狀態(tài)以及在服務器文件系統(tǒng)中存儲應用數(shù)據(jù)等內(nèi)容在本章后面的章節(jié)討論。5.1.6動態(tài)鏈接庫
ASP.Net提供了多種代碼復用方式。前面討論了通過創(chuàng)建服務或用戶控件類來共享多個應用或一個應用的多個頁面中的代碼。創(chuàng)建DLL(動態(tài)鏈接庫)類是通過類庫進行代碼共享的傳統(tǒng)方法。
創(chuàng)建DLL類時,選擇VisualStudio菜單“文件→新建→項目…”創(chuàng)建新的工程。然后,在VisualStudio的安裝模板中,選擇“類庫”,將打開一個C#名字空間頁面,在此可以寫多個類。類創(chuàng)建和編譯完成后,就可以在需要庫功能的Web應用中通過使用“添加引用…”選項來訪問這些類。一旦找到到類庫的位置,并在應用中添加了庫時,類的執(zhí)行代碼就會被載入到應用的bin文件夾中。下面的例子中,在名字空間模板中創(chuàng)建了兩個簡單類。
namespacemyLibrary{
publicclassTemperatureConversion{
publicstaticInt32getFahrenheit(Int32c){
Doublef=c*9/5+32;
returnConvert.ToInt32(f);
}
publicstaticInt32getCelsius(Int32f){
Doublec=(f-32)*5/9;
returnConvert.ToInt32(c);
}
}
publicclassmyMath{
publicstaticlongabs(longx){
if(x>=0)return(x);elsereturn(-x);
}
}
}
在應用中使用“添加引用…”添加名字空間“myLibrary”后,就可以在程序中使用類庫。例如,名字空間“myLibrary”定義了類“TemperatureConcersion”,就可以使用TemperatureConcersion.getFahrenheit(Ctemp)訪問類中的函數(shù)。下面的例子是用名字空間訪問類庫。usingmyLibrary;//YoumustusethenamespacenamedefinedinDLL
classmyApplication{
staticvoidMain(string[]args)
{
Int32Ctemp=23;
Int32Ftemp=121;
doublex=TemperatureConversion.getFahrenheit(Ctemp);//UsingDLLheredoubley=TemperatureConversion.getCelsius(Ftemp);//UsingDLLhere
System.Console.WriteLine(―Ctemp{0}isFtemp{1}",Ctemp,x);
System.Console.WriteLine(―Ftemp{0}isCtemp{1}",Ftemp,y);
}
}
Web應用是指具有計算能力的Web頁。在第一代Web中,HTML語言是瀏覽器唯一支持的語言,而后來的瀏覽器支持更多的語言,包括許多腳本語言和其他計算方法。5.2Web應用模型5.2.1純基于HTML的Web應用
純粹的HTMLWeb頁不支持計算,但是,它提供了大量的方法和格式,例如GET、POST、PUT、HEAD以及DELETE,用來發(fā)送和接收來自服務器的數(shù)據(jù)。例如,下面的代碼允許用戶輸入數(shù)據(jù)、進行操作,并且發(fā)送數(shù)據(jù)到服務器進行計算。<html>
<body>
<form>
<inputtype="text"name="operand1"VALUE="number"/>
<inputtype="text"name="operation"VALUE="operation"/>
<inputtype="text"name="operand2"VALUE="number"/>
<inputtype="submit"value="="/>
</form>
</body>
</html>在服務器端,當有來自Web站點的請求時,一個進程被實例化以處理數(shù)據(jù)并發(fā)送結果到頁面。通常情況下,在執(zhí)行計算之前,程序員必須提供自己的方式來收集足夠的信息、對額外的數(shù)據(jù)執(zhí)行大量的字符串處理、解釋數(shù)據(jù)。隨著Web計算技術的進步,使用這種方式開發(fā)Web應用的人越來越少。5.2.2客戶端腳本編寫
在Web瀏覽器中增加執(zhí)行腳本語言的能力,是從桌面計算轉移到Web計算的重要里程碑。JavaScript是最早最廣泛使用的腳本語言之一。
Netscape公司BrendanEich開發(fā)的Mocha,后來改名為LiveScript,是第一代JavaScript,被用在1995年12月發(fā)布的Netscape瀏覽器2.0B3中。在LiveScript發(fā)布不久后,這個流行的腳本語言以新的名字“JavaScript”出現(xiàn)在Netscape公司和SunMicrosystems公司的合作中;現(xiàn)在“JavaScript”是SunMicrosystems公司的注冊商標。下列代碼說明了一個帶有<script>元素的HTML頁面,這個<script>元素包含JavaScript函數(shù)。
<html>
<body>
<scripttype="text/JavaScript">
functionadd2Nos(){
document.sum.z.value=parseInt(document.sum.x.value)
+parseInt(document.sum.y.value)
}
</script>
<formname="sum">
<inputtype="text"name="x"size=5maxlength="5">
+
<inputtype="text"name="y"size=-5"maxlength="5">
<inputtype="button"value="="name="Submit"
onClick="add2Nos()"><inputtype="text"name="z"size="5"maxlength="5">
</form>
</body>
</html>可以看出,腳本程序被嵌入到HTML代碼中,并被載入到客戶端瀏覽器,腳本在瀏覽器中執(zhí)行。這一技術被稱為客戶端腳本。在這個例子中,Web頁面從輸入表格里獲?。矀€數(shù)字,通過調(diào)用JavaScript函數(shù)在頁面執(zhí)行加法,不需要和服務器進行數(shù)據(jù)通信。
隨著腳本語言的流行,越來越多的腳本語言出現(xiàn)了,其解釋器也被嵌入到Web瀏覽器中。許多傳統(tǒng)的編程語言也被升級以提供腳本能力。由于規(guī)模的限制,許多腳本語言不被瀏覽器支持,這些腳本語言只能用于服務器端,而服務器幾乎支持任何腳本語言以及傳統(tǒng)的編程語言。按照功能和用途,腳本語言可以分為以下幾種:
(1)作業(yè)控制語言和Shells,包括:IBMJCL,UnixScript以及AppleScript;
(2)GUI/可視化編程語言,包括:OracleSOASuite支持的GraphicBPEL,ActiveBPEL,MicrosoftVPL以及NationalInstrumentLabView;
(3)具體應用語言,包括:QuickC,EmacsList,用于機器人編程的ParallaxC;
(4)擴展/嵌入式語言,包括:嵌入到YahooWidgetEngine中的SpiderMonkey,AdobeFlash(ActionScript),Silverligh,TCL,Perl以及Python;
(5)Web客戶端腳本,包括:AJAX,CSS,XSLT,JavaScript,ECMAScript以及VBScript;
(6)動態(tài)語言和服務器端腳本語言,包括:Java,PHP,C#和Ruby。
圖5.4說明了部分編程語言以及這些語言在傳統(tǒng)編程語言和腳本語言中所處的位置。
圖5.4傳統(tǒng)編程語言和腳本語言
客戶端腳本主要的好處是在客戶端瀏覽器完成計算,這樣降低了客戶端和服務器之間來回傳輸數(shù)據(jù)的壓力,然而也存在一些弊端,包括:
(1)腳本編碼需要解釋。解釋執(zhí)行通常比編譯執(zhí)行慢。
(2)腳本編碼無法重用。腳本不能調(diào)用另外一個網(wǎng)頁中的腳本函數(shù)。
(3)腳本編碼支持模塊化但不可擴展。可以定義單個函數(shù),但不能動態(tài)綁定和繼承。
(4)安全性。一方面,允許編碼在瀏覽器運行會給客戶機帶來安全隱患;
另一方面,通過瀏覽器的“查看源代碼”功能,可以查看腳本編碼,這給黑客提供了攻擊的漏洞。例如,http:///watch?v=MJNJjh4jORY提供的視頻顯示了黑客如何通過修改腳本進入到安全系統(tǒng)。5.2.3服務器端腳本編寫和后臺代碼計算
Web瀏覽器的計算能力受計算速度、內(nèi)存大小以及存取其他資源的限制,因此客戶端腳本只用于簡單的計算,要想具備強大的計算能力,只能選擇服務器端計算。
服務器端腳本看上去和客戶端腳本類似,但是它能夠解決客戶端腳本存在的許多問題。下面的代碼是服務器端腳本的例子,其中C#函數(shù)包含在HTML文件中。
<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Default.aspx.cs"Inherits="_Default"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"/TR/xhtml1/DTD/xhtml1transitional.dtd">
<htmlxmlns="/1999/xhtml">
<headrunat="server">
<title>ServerScripting</title>
</head><body>
<formid="Form1"runat="Server">
<asp:TextBoxID="op1"Runat="server"/>
+
<asp:TextBoxID="op2"Runat="server"/>
<asp:ButtonID="Button1"Text="="OnClick="add"Runat="server"/>
<asp:LabelID="result"Runat="server"/>
</form>
</body>
</html>
<scriptlanguage="C#"runat="server">
voidadd(Objectsender,EventArgse){
Int32a=Convert.ToInt32(op1.Text);
Int32b=Convert.ToInt32(op2.Text);
result.Text=Convert.ToString(a+b);
}
</script>
然而,服務器腳本依舊有著和客戶端腳本相同的問題,包括重用性、模塊化和擴展性。最終解決這些問題的方法是利用服務器端計算和后臺代碼。將代碼與用戶界面分離也支持層次化體系結構的概念,即將表示與應用邏輯分離。5.1節(jié)討論的例子使用了服務器端計算和后臺代碼的概念。表5.1總結了四種不同的基于Web的計算模型。本章后面的內(nèi)容主要關注服務器端后臺代碼的計算模型,因為它是常見的較高級的Web計算模型。表5.1基于Web的計算模型
傳統(tǒng)的過程(方法)調(diào)用會通過內(nèi)容轉換給進程產(chǎn)生一個私有的工作區(qū),也就是調(diào)用者會置換出來,并且它的執(zhí)行環(huán)境會保存在棧里。進程代碼會控制工作區(qū)。當進程執(zhí)行完之后,調(diào)用者的執(zhí)行環(huán)境被恢復,然后從下一條指令開始執(zhí)行。5.3狀態(tài)管理
Web服務和Web應用與它們的調(diào)用者松散耦合。它們通過數(shù)據(jù)交換進行通信。調(diào)用者的控制流不會跳轉到服務,但會發(fā)生環(huán)境切換。此外,Web服務和Web應用能同時被多個用戶訪問。Web服務和Web應用都是基于HTTP的,而HTTP是無狀態(tài)的,即每一個包都獨立于其他包。
因此,Web服務和Web應用的存儲和狀態(tài)管理完全不同于進程調(diào)用的模式。
默認情況下,Web服務和Web應用都是無狀態(tài)的:每次我們調(diào)用一個服務或訪問一個應用,它都會認為我們是一個新用戶。
但是,當我們把Web作為一個新的計算平臺時,很多情況下,我們都需要有狀態(tài)的計算,例如購物車服務、計數(shù)器、計時器等。5.3.1狀態(tài)管理技術綜述
為了提供有狀態(tài)的Web服務和應用,有些特殊問題需要考慮。表5.2列舉了ASP.Net中不同的Web服務和Web應用狀態(tài)管理方法。后面的討論中,我們會用Web應用狀態(tài)管理這一術語。討論的技術也適用于Web服務。表5.2ASP.Net狀態(tài)管理技術5.3.2視圖狀態(tài)
當用戶訪問ASPX頁面時,就生成一個XHTML頁面,并被發(fā)送給客戶端正在運行的瀏覽器。當在同一個瀏覽器會話中多次訪問一個頁面時,開發(fā)者會在XHTML中一個隱藏字段里保存這個頁面的信息。ASPX頁面可利用語法ViewState[“name”]對這個字段進行讀寫,其中“name”是一個字符串索引。隱藏字段可以保存被不同名字索引的字符串集合。
為了說明視圖狀態(tài)變量的使用,我們設計了一個Web計算器,如圖5.5所示。該應用提供了一個文本框,當輸入一個數(shù)字,并且當按下“AddtoSum”按鈕時,這個數(shù)字被添加到總和中。
圖5.5數(shù)字25連加3次后總和是75
首先,用傳統(tǒng)桌面編程技術把下面代碼放到Default.aspx網(wǎng)頁后臺,看看會有什么結果,其中類變量sum是用來保存總和的。
usingSystem;
publicpartialclass_Default:System.Web.UI.Page{
protectedvoidPage_Load(objectsender,EventArgse){}
Int32sum=0;
protectedvoidButton1_Click(objectsender,EventArgse){
Int32newValue=Convert.ToInt32(this.TextBox1.Text);
sum=sum+newValue;
this.Label1.Text=Convert.ToString(sum);
}
}當我們執(zhí)行程序并點擊按鈕“AddtoSum”,當前輸入值將代替目前正在運行的總和值顯示出來。原因是,每次訪問Web頁面或者每次點擊這個按鈕都會被視為一個新的會話,并且sum變量會被初始化為0。如果我們給類變量sum加上關鍵字static會出現(xiàn)什么情況呢?
staticint32sum=0;
在這種情況下,變量sum供所有會話使用,這些會話可能來自不同的瀏覽器和不同的電腦。換句話說,來自某一用戶的數(shù)據(jù)將被另一個用戶訪問。這顯然不是這個計算器應用希望的。視圖狀態(tài)是這個應用最恰當?shù)募夹g,變量ViewState[“Sum”]將被存儲在瀏覽器中的XHTML頁面的隱藏字段里,并且僅能被這個瀏覽器使用。下面我們將給出按鈕后臺的視圖狀態(tài)版本的代碼。
publicpartialclass_Default:System.Web.UI.Page{
protectedvoidPage_Load(objectsender,EventArgse){}
Int32FinalAmt=0;
protectedvoidButton1_Click(objectsender,EventArgse){
Int32sum=0;
if(ViewState["Sum"]==null)ViewState["Sum"]=0;
else{
Int32newValue=Convert.ToInt32(this.TextBox1.Text);
sum=(Int32)ViewState["Sum"]+newValue;
ViewState["Sum"]=sum;
this.Label1.Text=sum.ToString();
FinalAmt=sum;
}
}
}
由于數(shù)據(jù)存儲在客戶端,視圖狀態(tài)的好處是能最大限度的減少服務器的負擔,數(shù)據(jù)存儲在客戶端,視圖狀態(tài)可以使服務器處理更多數(shù)量的訪問。但視圖狀態(tài)也存在一些問題:視圖狀態(tài)僅能存儲字符型數(shù)據(jù),而且一個頁面的數(shù)據(jù)在另一個頁面不可見,即使這些頁面屬于同一會話。例如,如果我們的應用有兩個ASPX頁面:一個是添加到購物車頁面,用于計算所有購物的總花費;另一個是結賬頁面,用于訪問銀行服務以通過信用卡支付花費。因而,我們需要將來自購物車頁面的總花費傳遞到結賬頁面。不幸的是,結賬頁面無法讀取購物車頁面的數(shù)據(jù)。有幾種不同的方法來解決這個問題,例如,通過跨頁面調(diào)用,允許一個頁面調(diào)用另外一個頁面的方法。在下節(jié),我們將創(chuàng)建一個會話范圍可見的變量,叫做會話狀態(tài)。5.3.3會話狀態(tài)
會話狀態(tài)(SessionState)可以創(chuàng)建存儲服務端結構化對象的變量,并且變量的作用域是會話范圍。存儲在會話狀
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年神木市爾林兔鎮(zhèn)中心衛(wèi)生院招聘備考題庫及一套答案詳解
- 2026年摩托車維修(發(fā)動機維修)試題及答案
- 2025年高職機電一體化技術(PLC編程應用)試題及答案
- 2025年大學區(qū)塊鏈工程(區(qū)塊鏈安全技術)試題及答案
- 2025年中職(康復輔助)假肢適配試題及答案
- 2025年大學中國現(xiàn)代文學(戲劇解讀)試題及答案
- 2025年大學市場營銷(市場調(diào)研基礎)試題及答案
- 2025年中職(安全技術與管理)安全防護階段測試題及答案
- 2025年中職服裝工藝(工藝優(yōu)化)試題及答案
- 2025年大學大一(物聯(lián)網(wǎng)工程)通信操作試題及答案
- 中醫(yī)診所的規(guī)章制度范本
- 水下機器人的作業(yè)精度控制
- 三上語文【25秋1-26課必背知識晨讀單】
- 安全風險分級管控及隱患排查治理制度安全風險分級管控制度和隱患排查治理管理制度
- 攝影家協(xié)會作品評選打分細則
- T-CAPC 018-2025 糖尿病、高血壓與血脂異?;颊呷〕坦补芤?guī)范
- 2025年三級教育安全考試試題及答案
- GB/T 38235-2025工程用鋼絲環(huán)形網(wǎng)
- 西醫(yī)基礎知識培訓課件
- 《電磁發(fā)射滅火炮技術規(guī)范》
- 風機攀爬安全培訓課件
評論
0/150
提交評論