第10章 Web應用程式的資料分享 10-1 Web應用程式的基礎 10-2 設定ASP.NET的Web應用程式 10-3 網頁間的資料分享 10-4 Application與Session物件 10-5 Global.asax檔案的使用 10-6 Cookies的處理 10-7 Request物件的表單處理 10-8 跨程式的Web表單送回
10-1 Web應用程式的基礎 10-1-1 在IIS建立Web應用程式 10-1-2 在VWD測試伺服器建立 Web應用程式
10-1 Web應用程式的基礎 ASP.NET「應用程式」(Applications)是指使用ASP.NET技術建立的Web應用程式,它是由網頁相關檔案所組成,可以完成特定工作的應用程式。 ASP.NET應用程式簡單的說就是一種.NET Framework應用程式,因為它是在Web伺服器上執行的應用程式,所以稱為Web應用程式。
10-1-1 在IIS建立Web應用程式 在IIS的Web伺服器能夠將整個網站,或指定網站目錄建立成Web應用程式。並且能夠在同一個網站建立多個Web應用程式,每一個虛擬目錄都可以建立成為Web應用程式。 在IIS建立Web應用程式的方法,如下所示: 在IIS新增網站:主目錄預設是一個Web應用程式。 網站虛擬目錄(Virtual Directories):當目錄新增成為虛擬目錄或Web共用時,如果目錄擁有【指令碼】權限,它就是一個Web應用程式,詳細步驟請參閱第1-5-3節。 主目錄下實際路徑的子目錄:預設與上一層主目錄屬於同一個Web應用程式。
10-1-2 在VWD測試伺服器建立Web應用程式-1 VWD內建測試ASP.NET程式執行的程式開發伺服器,事實上,它就是1.0/1.1版名為Cassini的個人Web伺服器,這是支援ASP.NET技術的Web伺服器,可以在非IIS環境測試執行ASP.NET應用程式。 當VWD開啟「Ch10」資料夾網站和執行ASP.NET程式Default.aspx時,就會在工作列建立程式開發伺服器圖示,如下圖所示:
10-1-2 在VWD測試伺服器建立Web應用程式-2 在程式開發伺服器的圖示,執行右鍵【顯示詳細資訊】指令,可以看到伺服器的詳細資訊,一個VWD的程式開發伺服器只能建立一個Web應用程式,以此例它是在埠號1059建立Web應用程式。
10-2 設定ASP.NET的Web應用程式 10-2-1 Web.Config組態檔 10-2-2 Web介面的網站管理工具
10-2-1 Web.Config組態檔-說明 Web組態檔是ASP.NET技術Web應用程式的資源設定檔案,它是一份XML文件,內含Web應用程式相關設定的XML標籤,可以用來簡化ASP.NET應用程式的設定。 雖然我們可以自行編輯位在Web應用程式根目錄的Web.Config組態檔內容,不過,另一種簡單方式是直接使用下一節的Web介面網站管理工具,使用它來更改Web.Config檔案的相關設定。
10-2-1 Web.Config組態檔-範例 <?xml version="1.0" encoding="utf-8"?> <configuration> <appSettings/> <connectionStrings> <add name="iPodsConnectionString" connectionString="Provider=…" providerName="System.Data.OleDb" /> </connectionStrings> <system.web> <compilation debug="false" /> <authentication mode="Windows" /> <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="NoAccess.htm" /> <error statusCode="404" redirect="FileNotFound.htm" /> </customErrors> </system.web> </configuration>
10-2-2 Web介面的網站管理工具-啟動 在Visual Web Developer提供Web介面的ASP.NET網站管理工具,請啟動VWD開啟「Ch10」網站後,執行「網站」→「ASP.NET組態」指令,可以開啟瀏覽程式進入Web介面管理工具,如下圖所示:
10-2-2 Web介面的網站管理工具-安全性標籤
10-2-2 Web介面的網站管理工具-應用程式標籤 在此標籤可以更改Web應用程式設定、設定SMTP伺服器、更改應用程式狀態和除錯與追蹤模式,如下圖所示:
10-2-2 Web介面的網站管理工具-提供者標籤 在此標籤可以設定資料來源提供者(Data Provider),預設使用AspNetSqlProvider提供者。
10-3 網頁間的資料分享 10-3-1 在網頁間分享資料 10-3-2 網頁間資料分享的方法
10-3-1 在網頁間分享資料-說明 當使用者進入網站,因為HTTP通訊協定並不會保留客戶端的使用者狀態,在伺服端根本不知道瀏覽端有哪些使用者正在瀏覽和其使用狀態。 例如:在移至其他ASP.NET程式時,使用者資料並不會自動傳給下一頁,除非瀏覽每一頁時都讓使用者在Web表單重新輸入一次。
10-3-1 在網頁間分享資料-種類 分享給網站所有的使用者:在ASP.NET程式就是使用Application變數進行分享,例如:目前線上的使用者計數。 針對每位使用者的專屬資料:在ASP.NET程式就是Session變數的分享資料,例如:登入使用者的個人資料。
10-3-2 網頁間資料分享的方法 ASP.NET的資料分享方法,如下所示: Application和Session物件。 ASP.NET 2.0版的Profile物件,請參閱第17章。 使用Cookies保留在客戶端電腦。 將Web表單處理程式指定成其他ASP.NET程式,就可以將欄位資料傳遞到其他ASP.NET程式,即跨ASP.NET程式的表單送回。 Request物件配合表單或網址URL參數,將欄位資料和參數傳到其他ASP.NET程式,即ASP 3.0版的表單處理。
10-4 Application與Session物件
10-4-1 Application與Session物件的基礎-說明 在ASP.NET的Web應用程式擁有一個Application物件,針對每一位使用者擁有對應的Session物件,如下圖所示:
10-4-1 Application與Session物件的基礎-Application物件 Application物件的主要目的是建立Application變數的集合物件,可以提供進入Web應用程式的每位使用者一個資料分享的管道。它允許客戶端的每位使用者存取Application變數。以此例使用者1和2都可以存取Application變數。 Application物件存在期間是在第1個Session物件建立後產生,直到Web伺服器關機且所有的使用者都離線後Web應用程式結束後才會關閉。
10-4-1 Application與Session物件的基礎-Session物件 ASP.NET的【Session期間】是指Web應用程式從一頁ASP.NET網頁移到其他ASP.NET網頁過程中所花費的時間。ASP.NET技術提供相關類別來管理Session期間的資訊,也就是建立Session物件來保留Session期間的資料。 當一位尚未建立Session物件的使用者執行Web應用程式的ASP.NET程式時,伺服器就會自動建立一個對應的Session物件,而且指定唯一的Session ID編號。例如:上述圖例的每一位使用者都擁有專屬ID的Session物件,只允許對應使用者存取Session變數,在同一個Web應用程式的其他使用者並不能存取。
10-4-2 Application變數的使用-1 不論網站的Web應用程式有多少位使用者進入,對於每一個Application變數,伺服端都只會在記憶體保留一份資料,變數的基本格式如下: Application("Page_Counter") = 0 上述變數名稱和ASP.NET程式變數不太一樣,這是一個字串"Page_Counter",加上Application()來取得集合物件的指定元素,它可以將Application變數Page_Counter設為零。
10-4-2 Application變數的使用-2 為了避免資料存取衝突的情況,因為2位使用者同時讀取Application變數並沒有關係,如果一位更改,一位讀取Application變數,在這種情況下衝突就會發生,為了避免這種情況,Application的方法可以保障在同一時間內只允許一位使用者存取Application變數,如下所示: Application.Lock() Application("Page_Counter") = _ Application("Page_Counter")+1 Application.Unlock()
10-4-3 Session變數的使用-說明 Session變數是附屬在進入Web應用程式使用者的Session期間,每一位使用者擁有一組專屬Session變數,雖然每位使用者的Session變數名稱相同,但是內容可能完全不同,而且只有該使用者執行的ASP.NET程式才能夠存取自己專屬的Session變數。
10-4-3 Session變數的使用-方法與屬性
10-4-3 Session變數的使用-傳遞資料 Session變數可以在網頁間分享資料,換句話說,我們可以使用Session變數將Web表單輸入資料傳遞給其他ASP.NET程式,如下所示: Session("UserName") = name.Text Session("UserPassword") = pass.Text 只要使用者沒有超過Session期間或執行Abandon()方法,在期間內執行其他ASP.NET程式,都可以存取上述Session變數值,如下所示: name = Session("UserName") password = Session("UserPassword")
10-5 Global.asax檔案的使用 10-5-1 在VWD新增Global.asax檔案
10-5 Global.asax檔案的使用 Global.asax是選擇性檔案,在ASP.NET的Web應用程式並不一定需要此檔案,除非Web應用程式需要使用到Application和Session物件的事件,因為這些事件處理程序是位在Global.asax檔案。 在ASP.NET的Web應用程式新增Global.asax檔案時,請注意!一個Web應用程式只能擁有唯一的Global.asax檔案,其位置是Web應用程式的根目錄。
10-5-1 在VWD新增Global.asax檔案 ASP.NET的Global.asax檔案是ANSI文字檔案,使用Windows記事本或VWD都可以編輯Global.asax檔案的內容。在Visual Web Developer新增Global.asax檔案的步驟,如下所示: 1. 請啟動VWD開啟「Ch10」網站後,執行「檔案」→「新增」→「檔案」指令,可以看到「加入新項目」對話方塊。 2. 選【全球應用程式類別】(如果網站已經新增,就不會看到此項目),按【加入】鈕就可以在網站新增Global.asax檔案。
10-5-2 Global.asax檔案的架構-架構 <%@ Application Language="VB" %> <script Runat="server"> Sub Application_Start(ByVal Sender As Object, _ ByVal E As EventArgs) End Sub Sub Application_End(ByVal Sender As Object, _ Sub Application_Error(ByVal Sender As Object, _ Sub Session_Start(ByVal sender As Object, _ ByVal e As EventArgs) Sub Session_End(ByVal sender As Object, _ </script>
10-5-2 Global.asax檔案的架構-說明
10-5-3 Global.asax檔案的使用-1 當使用者請求ASP.NET程式後,就會替每位使用者建立Session期間,接著檢查ASP.NET應用程式是否擁有Global.asax檔案。 如果有Global.asax檔案,在執行ASP.NET檔案的程式碼前,如果是第1位使用者,就觸發Application物件的Start事件,執行Global.asax檔案的Application_Start()事件處理程序,接著建立Session物件,因為Global.asax檔案存在,接著執行Session_Start()事件處理程序。
10-5-3 Global.asax檔案的使用-2 當Session期間超過TimeOut屬性的設定(預設20分鐘)或執行Abandon()方法,表示Session期間結束,就觸發Session物件的End事件執行Session_End()事件處理程式,處理程序是在關閉Session物件前執行。 Web伺服器如果關機,在關閉Application物件前就會執行Application_End()事件處理程序,當然也會結束所有使用者的Session期間,和執行所有使用者的Session_End()事件處理程序。
10-6 Cookies的處理 10-6-1 Cookies的基礎 10-6-2 新增Cookie 10-6-3 取得Cookie的值
10-6-1 Cookies的基礎-說明 Cookies的英文意義是小餅乾,源於這些儲存在客戶端電腦的檔案尺寸都很小,Cookies儲存在瀏覽程式所在的電腦,所以並不會浪費Web伺服器的資源。 在ASP.NET程式只需檢查客戶端是否有儲存Cookie,在取得Cookie的保留資訊後,就可以輕鬆建立複雜的Web應用程式。
10-6-1 Cookies的基礎-用途 Cookies在網站實作上的應用相當多,使用Cookies保留的資料大都屬於幾個方面,如下所示:
10-6-2 新增Cookie Cookie是一種集合物件,可以使用名稱存取Cookie值,新增Cookie是使用Response物件的Cookies屬性來新增Cookie,其程式碼如下所示: Dim name As String = "江小魚" Response.Cookies("UserName").Value = name 在新增Cookie後還需要設定Cookie的Expires屬性,即Cookie檔案存在客戶端電腦的期限,如下所示: Dim dtDay As Date = DateAdd("D", 10, Today) Response.Cookies("UserName").Expires = dtDay
10-6-3 取得Cookie的值 在客戶端電腦如果擁有Cookie,ASP.NET程式可以使用Request物件的Cookies集合物件來取得指定的Cookie值,如下所示: name = Request.Cookies("UserName").Value 上述程式碼可以取得Cookie名稱UserName的值,並且將它指定給變數name。
10-6-4 刪除Cookie 客戶端的Cookie如果不再需要,在ASP.NET程式可以刪除Cookie,刪除方式是將Expires屬性設定成過期的時間,如下所示: Dim dtDay As Date = DateAdd("D", -365, Today) Response.Cookies("UserName").Expires = dtDay 上述程式碼將有效期限設為一年前,因為Cookie已經過期,換句話說,就是刪除Cookie。
10-6-5 多鍵Cookie的使用-說明 Cookie是一種目錄結構的集合物件,在同名Cookie下可以擁有不同Key的鍵名。換句話說,同一個Cookie名稱就可以儲存多種資料。
10-6-5 多鍵Cookie的使用-新增多鍵的Cookie 在ASP.NET程式新增多鍵Cookie,需要在名稱後再加上鍵名,如下所示: Response.Cookies("User")("UserName") = "陳會安" Response.Cookies("User")("Password") = "1234" Response.Cookies("User").Expires = _ DateAdd("D",10,Today)
10-6-5 多鍵Cookie的使用-取得多鍵的Cookie值 name = _ Request.Cookies("User")("UserName") pass = Request.Cookies("User")("Password")
10-6-5 多鍵Cookie的使用-刪除多鍵的Cookie 多鍵Cookie的刪除和第10-6-4節相同,只需將Cookie的Expires屬性設為過期後,就可以刪除Cookie。如果只刪除Cookie其中一個鍵名,請將該鍵名設成空字串即可,如下所示: Response.Cookies("User")("Password") = "" 上述程式碼刪除Cookie名稱為User的Password鍵名。
10-7 Request物件的表單處理 10-7-1 Form與QueryString集合物件 10-7-2 Request物件的表單處理
10-7-1 Form與QueryString集合物件-ASP 3.0版的表單處理 ASP 3.0版的表單處理就是使用Request物件的Form與QueryString集合物件來取得輸入資料,如下所示: 傳統HTML/XHTML表單網頁:使用表單欄位以HTTP通訊協定的檔頭傳遞表單欄位資料,可以使用POST或GET方法,如下所示: <form name="name" method="POST | GET" action="URL"> ………. </form> URL參數:從瀏覽程式輸入的網址傳遞參數,其總長度只有1024個字元。
10-7-1 Form與QueryString集合物件-Form集合物件 網頁表單如果使用POST方法傳遞資料,它是將傳遞資料在編碼後,透過HTTP通訊協定的標頭資料傳送到Web伺服器,在伺服端可以使用Form集合物件來取出資料,其語法如下所示: Request(("FieldName") Request.Form("FieldName")
10-7-1 Form與QueryString集合物件-QueryString集合物件 網頁表單如果使用GET方法傳遞資料,就是將傳遞資料編碼後,透過URL網址後的字串傳送到Web伺服器,參數是位在問號之後,如果參數不只一個,請使用「&」符號分隔,如下所示: http://localhost/Ch10-7-2.aspx?fname1=value1&fname2=value2 當瀏覽程式輸入上述網址,按下Enter鍵後,伺服端就可以使用QueryString集合物件來取出資料,如下所示: Request(("FieldName") Request.QueryString(" FieldName")
10-7-2 Request物件的表單處理 Request物件的表單處理除了可以使用使用表單方式來傳遞資料外,還可以使用超連結URL參數來傳送資料給其他ASP.NET程式。 URL超連結傳遞的參數或表單GET方法傳遞的內容,都是使用QueryString集合物件,POST方法是使用Form集合物件來取得URL參數或欄位值,如下所示: name = Request("Username") pass = Request("Password") 程式碼沒有指定QueryString或Form集合物件,換句話說,它可以取得URL參數和表單POST方法傳遞的參數,右邊括號內是參數或欄位名稱字串。
10-8 跨程式的Web表單送回-說明 ASP.NET 2.0版可以使用PreviousPage物件執行跨ASP.NET程式的Web表單送回。換句話說,我們可以將Web表單處理程式指定成其他ASP.NET程式(預設是自己),也就是將欄位資料傳遞給其他ASP.NET程式。
10-8 跨程式的Web表單送回-指定Web表單處理程式 ASP.NET 2.0版可以使用PreviousPage物件執行跨ASP.NET程式的Web表單送回。換句話說,我們可以將Web表單處理程式指定成其他ASP.NET程式(預設是自己),也就是將欄位資料傳遞給其他ASP.NET程式。 在Web表單的Button控制項可以使用PostBackUrl屬性來指定表單送回的ASP.NET程式,如下所示: <asp:Button Id="Button" Text="下一步" Runat="server" PostBackUrl="Ch10-8Second.aspx"/> 上述Button控制項指定表單送回至ASP.NET程式Ch10-8Second.aspx。
10-8 跨程式的Web表單送回-取得跨程式Web表單的控制項 ASP.NET程式的Page_Load()事件處理程序,可以使用FindControl()方法取得前一頁ASP.NET程式的控制項,如下所示: Dim txt As TextBox txt = PreviousPage.FindControl("user") name.Text = txt.Text txt = PreviousPage.FindControl("pass") pass.Text = txt.Text 上述程式碼使用PreviousPage屬性取得前一頁的Page物件後,使用FindControl()方法找尋指定名稱的控制項,以此例是名為user和pass的2個TextBox控制項,然後取得Text屬性的控制項值。