ASP.NET 2.0網頁製作徹底研究

Download Report

Transcript ASP.NET 2.0網頁製作徹底研究

第11章 ASP.NET的Web應用程
式








11-1
11-2
11-3
11-4
11-5
11-6
11-7
11-8
ASP.NET應用程式的基礎
Global.asax檔的使用
Application物件的狀態管理
Session物件的狀態管理
Application與Session物件的使用
在網頁間傳遞Web表單內容
使用web.config組態檔
ASP.NET 2.0的網站設定工具
11-1 ASP.NET應用程式的基礎



11-1-1 ASP.NET的Web應用程式
11-1-2 網頁間資料分享的基礎
11-1-3 網頁間的資料傳遞方法
11-1-1 ASP.NET的Web應用程式


ASP.NET應用程式是一種.NET
Framework應用程式,它是在Web伺服器
上執行的應用程式,稱為Web應用程式。
ASP.NET應用程式就是HttpApplication類
別的物件,負責處理應用程式的HTTP請求。
在IIS的Web伺服器能夠將整個網站,或指
定網站目錄建立成Web應用程式。IIS能夠
在同一個網站建立多個Web應用程式,每
一個虛擬目錄都可以建立成為Web應用程
式。
11-1-2 網頁間資料分享的基礎Session期間


ASP.NET的【Session期間】是指Web應
用程式從一頁ASP.NET網頁移到其他
ASP.NET網頁過程中所花費的時間,並不
是指第11-4節的Session物件。
在ASP.NET是使用
Sytem.Web.SessionState名稱空間的類
別來管理Session期間的資訊,也就是建立
Session物件來保留Session期間的資料。
11-1-2 網頁間資料分享的基礎-網站
的資料分享


當使用者進入網站,如果是會員管理網站,在登
入後可以取得使用者的瀏覽權限,但是伺服端並
不知道目前客戶端有哪些使用者正在瀏覽,和其
使用狀態。因為使用者在移至其他網頁時,使用
者登入資料並不會自動傳給下一頁網頁。
資料分享主要分為兩種,如下所示:
• 分享給網站所有使用者:在ASP.NET程式可以使用
Application變數進行分享,例如:目前線上的使用者
數。
• 每位使用者的專屬資料:在ASP.NET程式可以使用
Session變數進行分享,例如:登入使用者的權限。
11-1-3 網頁間的資料傳遞方法-說明


在ASP.NET程式間的資料傳遞方法,換個
角度來說,就是如何保留使用者狀態的方
法,稱為「狀態管理」(State
Management)。
以資料儲存的位置分為兩大類:
• 客戶端
• 伺服端
11-1-3 網頁間的資料傳遞方法-客戶
端的狀態管理

客戶端的狀態管理是將資料儲存在使用者
電腦,或是直接儲存在ASP.NET程式建立
的網頁中,如下表所示:
狀態管理方法
Cookies
說明
Cookies 是保留在使用者電腦的小檔案,檔案內容是一
些使用者資訊
ViewState
ASP.NET 的 ViewState 功能,在表單送回時能夠在網頁
使用 ViewState 屬性保留使用者資料
隱藏欄位
使用表單隱藏欄位送回表單資料或傳遞資料到其他網頁
QueryString 集合物 使用網址 URL 參數,即在 URL 網址加上參數,將資料
件
傳遞給其他網頁
11-1-3 網頁間的資料傳遞方法-伺服
端的狀態管理

伺服端的狀態管理是將資料儲存在伺服器
電腦,換句話說,它會佔用Web伺服器的
系統資源,如下表所示:
狀態管理方法
說明
Application 物件
使用 Application 物件的變數儲存使用者資訊
Session 物件
使用 Session 物件的變數儲存使用者資訊
資料庫
使用資料庫的記錄儲存使用者資訊
XML 文件或文字檔案
使用 XML 文件或文字檔案儲存使用者資訊
Profile 物件
使用 HttpModules 類別的 Profile 物件儲存使用者資訊,這
是 ASP.NET 2.0 版新功能,詳細說明,請參閱第 14 章
11-2 Global.asax檔的使用


11-2-1 Global.asax檔案的架構
11-2-2 Global.asax檔案的使用
11-2-1 Global.asax檔案的架構-新增
Global.asax檔案


ASP.NET的Global.asax檔案是ANSI文字檔案,
使用Windows記事本或VWD都可以編輯
Global.asax檔案內容。
Visual Web Developer可以新增Global.asax
檔案。請啟動VWD開啟「Ch11」網站後,執行
「檔案/新增/檔案」指令,可以看到「加入新項
目」對話方塊。
11-2-1 Global.asax檔案的架構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, _
ByVal E As EventArgs)
End Sub
Sub Application_Error(ByVal Sender As Object, _
ByVal E As EventArgs)
End Sub
Sub Session_Start(ByVal sender As Object, _
ByVal e As EventArgs)
End Sub
Sub Session_End(ByVal sender As Object, _
ByVal e As EventArgs)
End Sub
</script>
11-2-1 Global.asax檔案的架構-說明
事件處理程序
Application_Start()
說明
當第 1 位使用者進入 ASP.NET 程式時,Application_Start
事件就觸發,在觸發後,就算有成千上萬位使用者進入
網站都不會重新觸發,除非 Web 伺服器關機。通常用來
初始 Application 變數,例如:初始的訪客計數
Application_End()
當 Web 伺服器關機,Application_End 事件就會觸發
Application_Error()
產生未能處理錯誤時,觸發 Application_Error 事件
Session_Start()
當使用者建立 Session 期間時,就觸發 Session_Star 事件,
如果有 50 位使用者,就觸發 50 次事件,每個事件是獨
立觸發,不會互相影響,通常是用來初始使用者專屬的
Session 變數
Session_End()
使用者在預設時間內沒有進入其他 ASP.NET 程式,就會
觸發此事件,時間是由 TimeOut 屬性設定,通常是善後
用途的程式碼,例如:將 Session 變數存入資料庫或文字
檔案
11-2-2 Global.asax檔案的使用-執行
順序1


當使用者請求ASP.NET程式後,就會替每位使用
者建立Session期間和Application物件,接著檢
查ASP.NET應用程式是否擁有Global.asax檔案。
如果有Global.asax檔案,就將它編譯成繼承
HttpApplication類別的物件,然後在執行
ASP.NET檔案的程式碼前觸發
Application_Start事件,執行Global.asax檔案
的Application_Start()事件處理程序,接著建立
Session物件,因為Global.asax檔案存在,接
著執行Session_Start()事件處理程序。
11-2-2 Global.asax檔案的使用-執行
順序2


當Session期間超過TimeOut屬性的設定(預設
20分鐘)或執行Abandon()方法,表示Session
期間結束,就觸發Session_End執行
Session_End()事件處理程式,處理程序是在關
閉Session物件前執行。
Web伺服器如果關機,在關閉Application物件
前就會執行Application_End()事件處理程序,
當然也會結束所有使用者的Session期間,和執
行所有使用者的Session_End()事件處理程序。
11-3 Application物件的狀態管理


11-3-1 Application物件的基礎
11-3-2 網站的訪客計數
11-3-1 Application物件的基礎-什麼
是Application物件


Application物件可以建立Application變
數,它和一般程式變數不同,Application
變數是一個Contents集合物件,此變數可
以提供造訪網站的每位使用者一個分享資
料的管道,因為Application變數允許網站
每位使用者取得或更改其值。
Application物件是在第1個Session物件
建立後建立,Application物件的範圍直到
Web伺服器關機或所有的使用者都離線後
才會刪除。
11-3-1 Application物件的基礎Application變數的使用

不論網站有多少位使用者同時瀏覽網站
(不是指登入網站的使用者),在伺服端
記憶體只保留一份Application變數,其變
數格式如下:
Application("HitCounter") = 1234

上述程式碼將名為Hit_Counter的
Application變數設為1234,此變數和
ASP.NET程式變數不一樣,它是取得
Contents集合物件的元素,變數名稱是字
串。
11-3-1 Application物件的基礎Application狀態管理的同步


ASP.NET應用程式的每位使用者都可以存取
Application變數,使用者可以同時讀取
Application變數,但是如果有一位更改資料,其
他讀取資料,此時資料衝突情況就會發生,為了
避免此情況,需要考慮同步問題。
在Application物件提供Lock()和Unlock()方法,
可以保障在同一時間內,只允許一位使用者存取
Application變數,其程式碼如下所示:
Application.Lock()
Application("HitCounter")= _
Application("HitCounter")+1
Application.Unlock()
11-3-2 網站的訪客計數-說明


網站的訪客計數是一種必備元件,其目的是顯示
有多少位訪客曾經瀏覽網站,顯示資訊可以從開
站以來的訪客數,或一段時間內的訪客數。
ASP.NET的訪客計數是在Global.asax檔案的
Session_Start()事件處理程序,使用
Application變數記錄訪客計數,如下所示:
Application("HitCounter")= _
Application("HitCounter")+1

上述Application變數記錄目前的訪客計數,別忘
了!使用Lock()和Unlock()方法。
11-3-2 網站的訪客計數-圖例
11-4 Session物件的狀態管理


11-4-1 Session物件的基礎
11-4-2 目前有多少人在線上
11-4-1 Session物件的基礎-什麼是
Session物件


每一個Session物件擁有唯一的Session
ID編號,在整個瀏覽ASP.NET應用程式的
過程(造訪不同ASP.NET程式時),都可
以存取Session物件建立的變數。
在ASP.NET的Web應用程式是使用
Session ID判斷使用者是否仍在Session
期間,它是直到Session物件TimeOut屬
性設定時間到時(預設值20分鐘),或執
行Abandon()方法後才會結束Session期
間。
11-4-1 Session物件的基礎-Session
變數的使用


Session變數是使用者的專屬資料,雖然每位使
用者的Session變數名稱相同,但是值可能不同。
而且只有該位使用者才能存取自己的Session變
數。
例如:使用者hueyan進入網站,建立Session變
數的程式碼如下:
Session("username") = "hueyan"
Session("password") = "1234"

上述Session變數屬於使用者hueyan。接著另一
位使用者jane也進入網站,也會替他建立一組
Session變數,其程式碼如下:
Session("username") = "jane"
Session("password") = "4567"
11-4-2 目前有多少人在線上

訪客計數是歷史記錄,線上使用者數是目前的即
時狀態,如果想知道目前有多少位使用者停留在
網站?其最大問題是如何判斷使用者目前仍在線
上,我們可以指定TimeOut屬性,以停留在網站
多久時間來判斷是否為線上使用者,如下所示:
Session.TimeOut = 5

上述程式碼指定值是分鐘,也就是說停留5分鐘的
使用者算是目前線上的使用者,不過,
Application_Start()事件處理程序並不能指定
TimeOut屬性,它是位在Session_Start()事件
處理程序。
11-5 Application與Session物件的使
用


11-5-1 正確使用Application和Session變數
11-5-2 使用Application和Session物件儲存物
件
11-5-1 正確使用Application和
Session變數


Session變數不同於Application變數,其
儲存資料是使用者專屬資料,換句話說,
除非是使用者相關資料,否則使用Session
變數只是浪費伺服器的記憶體資源。
Session變數的目的是儲存使用者專屬資料,
對於固定內容的變數,應該使用
Application變數,因為Appliction變數是
分享給所有使用者。
11-5-2 使用Application和Session物
件儲存物件

Application和Session變數可以用來儲存
Hashtable集合物件,如下所示:
Dim userArray As Hashtable = New Hashtable(5)
Application("UserList") = userArray

不只如此,還可以儲存ADO.NET的DataView物
件,如下所示:
Dim objView As DataView= _
New DataView(objDs.Tables(0))
Application("Source") = objView
11-6 在網頁間傳遞Web表單內容




11-6-1
11-6-2
11-6-3
11-6-4
使用URL參數
使用Session變數
使用Web表單的類別屬性
使用PreviousPage物件
11-6-1 使用URL參數-說明


舊版ASP的網頁間資料傳遞除了使用表單
外,還可以使用URL網址參數來傳遞資料,
在接收網頁是使用QueryString集合物件
取得傳遞值,其優點是簡單,但問題是瀏
覽程式網址欄會顯示傳遞值。
筆者準備建立擁有2個步驟的Web表單,在
輸入使用者名稱和密碼後,按【下一步】
鈕在第二頁ASP.NET程式顯示使用者資料。
11-6-1 使用URL參數-步驟一

在步驟一的Web表單擁有2個TextBox控制項,
可以輸入使用者資料,按【下一步】鈕執行
GotoNextStep()事件處理程序,如下所示:
Sub GotoNextStep(Sender As Object, E As
Eventargs)
Dim url As String
url = "Ch11-6-1Second.aspx?username=" & _
user.Text & "&password=" & _
pass.Text
Response.Redirect(url)
End Sub
11-6-1 使用URL參數-步驟二

在步驟二ASP.NET程式的Page_Load()事
件處理程序,可以使用QueryString集合
物件取得參數值,如下所示:
Sub Page_Load(Sender As Object, _
E As Eventargs)
name.Text = _
Request.QueryString("username")
pass.Text = _
Request.QueryString("password")
End Sub
11-6-2 使用Session變數-步驟一
步驟一的Web表單擁有2個TextBox控制項,可
以輸入使用者資料,按【下一步】鈕執行
GotoNextStep()事件處理程序,如下所示:
Sub GotoNextStep(Sender As Object, _
E As Eventargs)
Session("UserName") = user.Text
Session("Password") = pass.Text
Response.Redirect( _
"Ch11-6-2Second.aspx")
End Sub

11-6-2 使用Session變數-步驟二
在步驟二ASP.NET程式的Page_Load()事件處理
程序,使用Session變數取得傳遞的變數值,如
下所示:
Sub Page_Load(Sender As Object, _
E As Eventargs)
name.Text = Session("UserName")
pass.Text = Session("Password")
Session.Remove("UserName")
Session.Remove("Password")
End Sub

11-6-3 使用Web表單的類別屬性定義Page類別的屬性
Web表單可以使用Page類別屬性來傳遞表單資料。我們
可以使用Page指引的ClassName屬性指定類別名稱,如
下所示:
<%@ Page Language="VB"
ClassName="firstStepClass" %>
 Page指引的CalssName屬性指定類別名稱是
firstStepClass,接著可以使用Property指令定義類別的
屬性,如下所示:
Public ReadOnly Property UserName() As String
Get
Return user.Text
End Get
End Property

11-6-3 使用Web表單的類別屬性步驟一
步驟一的Web表單擁有2個TextBox控制項,可
以輸入使用者資料,程式開頭的Page指引指令,
如下所示:
<%@ Page Language="VB"
ClassName="firstStepClass" %>
 按【下一步】鈕執行GotoNextStep()事件處理
程序,在<script>標籤的程式碼建立2個屬性
UserName和Password,屬性值是TextBox控
制項的Text屬性,最後GotoNextStep()程序使
用Server.Transfer()方法轉址至步驟二的
ASP.NET程式。

11-6-3 使用Web表單的類別屬性步驟二

步驟二ASP.NET程式的開頭是Reference指引,
如下所示:
<%@ Reference Page="Ch11-6-3.aspx" %>

Page_Load()事件處理程序可以取得屬性值,如
下所示:
Sub Page_Load(Sender As Object, E As Eventargs)
If Not IsPostBack Then
Dim fs As firstStepClass = Context.Handler
name.Text = fs.UserName
pass.Text = fs.Password
End If
End Sub
11-6-4 使用PreviousPage物件步驟一


ASP.NET 2.0版可以使用PreviusPage物
件執行跨ASP.NET程式的Web表單送回。
步驟一的Web表單擁有2個TextBox控制項,
可以輸入使用者資料,在Button控制項使
用PostBackUrl屬性指定送回的ASP.NET
程式,如下所示:
<asp:Button Id="Button" Text="下一步"
Runat="server“
PostBackUrl="Ch11-6-4Second.aspx"/>
11-6-4 使用PreviousPage物件步驟二

在步驟二ASP.NET程式的Page_Load()事件處理
程序,使用FindControl()方法取得前一頁
ASP.NET的控制項,如下所示:
Sub Page_Load(Sender As Object, E As Eventargs)
If Not IsPostBack Then
Dim txt As TextBox
txt = PreviousPage.FindControl("user")
name.Text = txt.Text
txt = PreviousPage.FindControl("pass")
pass.Text = txt.Text
End If
End Sub
11-7 使用web.config組態檔






11-7-1 Web組態檔的基礎
11-7-2 appSettings與connectionStrings區
段的參數和連結字串
11-7-3 在sessionState區段設定Session狀態
11-7-4 globalization區段的編碼設定
11-7-5 compilation區段的編譯設定
11-7-6 customErrors區段的自訂錯誤網頁
11-7-1 Web組態檔的基礎-說明


Web組態檔web.config是ASP.NET技術Web應
用程式的資源設定檔案,它是一份XML文件,內
含Web應用程式相關設定的XML標籤,可以用來
簡化ASP.NET應用程式的相關設定。
Web組態檔web.config是位在Web應用程式的
任何目錄,子目錄如果沒有web.config檔案,就
是繼承父目錄web.config檔案的相關設定;如果
子目錄擁有web.config檔案,就會覆寫父目錄
web.config檔案的相關設定。
11-7-1 Web組態檔的基礎-範例
<configuration>
<appSettings>
<add key="dbType" value="Access Database"/>
</appSettings>
<connectionStrings>
<add name="provider"
connectionString="Microsoft.Jet.OLEDB.4.0;"/>
<add name="database"
connectionString="/Ch11/Products.mdb"/>
</connectionStrings>
<system.web>
<sessionState cookieless="false" timeout="10"/>
<globalization
fileEncoding="big5"
requestEncoding="big5"
responseEncoding="big5"
culture="zh-TW"/>
<compilation defaultLanguage="VB" debug="true"/>
<customErrors mode="RemoteOnly"/>
</system.web>
</configuration>
11-7-1 Web組態檔的基礎-標籤說明1
設定區段
說明
<anonymousIdentification> 控制 Web 應用程式的匿名使用者,詳細的說明請參閱
第 16 章
<authentication>
設定 ASP.NET 驗證方式,請參閱第 13 章
<authorization>
設定 ASP.NET 使用者授權,請參閱第 13 章
<browserCaps>
設定瀏覽程式相容元件 HttpBrowserCapabilities
<compilation>
設定 ASP.NET 應用程式的編譯方式
<customErrors>
設定 ASP.NET 應用程式的自訂錯誤處理
<globalization>
關於 ASP.NET 應用程式的全球化設定,也就是本地化
設定
<httpHandlers>
設定 HTTP 處理是對應到 URL 請求的 IHttpHandler 類
別
<httpModules>
新增、刪除或清除 ASP.NET 應用程式的 HTTP 模組
<httpRuntime>
ASP.NET 的 HTTP 執行期相關設定
<identity>
設定 ASP.NET 應用程式的使用者識別是使用伺服端使
用者帳號的權限(impersonate 屬性)
,或指定的使用者
帳號(userName 和 password 屬性)
11-7-1 Web組態檔的基礎-標籤說明2
設定區段
<machineKey>
<membership>
<pages>
<profile>
<roles>
<sessionState>
<siteMap>
<trace>
<webParts>
<webServices>
說明
設定在使用表單基礎驗證的 Cookie 資料時,用來加碼
和解碼的金鑰值
設定 ASP.NET 的 Membership 機制,請參閱第 13 章
設定 ASP.NET 程式的相關設定,即 Page 指引指令的屬
性
設定個人化資訊的 Porfile 物件,詳細說明請參閱第 14
章
設定 ASP.NET 的角色管理,詳細說明請參閱第 13 章
設定 ASP.NET 應用程式的 Session 狀態 HttpModule
設定 ASP.NET 網站導覽,詳細說明請參閱第 12 章
ASP.NET 應用程式的除錯功能,可以設定是否追蹤應
用程式的執行
設定 ASP.NET 應用程式的網頁組件,詳細說明請參閱
第 18 章
設定 ASP.NET 的 Web 服務,詳見第 18 章的說明
11-7-2 appSettings與connectionStrings區段
的參數和連結字串-web.config的內容

在Web組態檔的<appSettings>區段可以新增
ASP.NET程式所需的參數,可以指定資料庫連結
字串,如下所示:
<configuration>
<appSettings>
<add key="dbType" value="Access Database"/>
</appSettings>
<connectionStrings>
<add name="provider"
connectionString="Microsoft.Jet.OLEDB.4.0;"/>
<add name="database"
connectionString="/Ch11/Products.mdb"/>
</connectionStrings>
</configuration>
11-7-2 appSettings與connectionStrings區段
的參數和連結字串-Conifguration API的基礎

ASP.NET 2.0版的Configuration API可以存取
web.config和machine.config組態檔的設定資
料。在ASP.NET程式是使用
System.Web.Configuration名稱空間的
WebConfigurationManager類別來存取相關設
定,如下所示:
Dim dbType As String = _
WebConfigurationManager.AppSettings("dbType")
Dim pd, db As String
pd=WebConfigurationManager.ConnectionStrings( _
"provider").ConnectionString
db=WebConfigurationManager.ConnectionStrings( _
"database").ConnectionString
11-7-3 在sessionState區段設定
Session狀態
ASP.NET的Session狀態管理擁有擴充性,我們
可以在web.config檔案的<sessionState>區段
設定Session狀態管理,它屬於<system.web>
的子標籤,如下所示:
<configuration>
<system.web>
<sessionState cookieless="false"
timeout="10"/>
………
</system.web>
</configuration>

11-7-4 globalization區段的編碼設定

在<system.web>子標籤的<globalization>區
段是本地化相關設定,可以設定ASP.NET程式預
設的檔案編碼、請求和回應的編碼方式、日期時
間格式和數字等本地化等相關設定,如下所示:
<configuration>
<system.web>
<globalization
fileEncoding="big5"
requestEncoding="big5"
responseEncoding="big5"
culture="zh-TW"/>
………
</system.web>
</configuration>
11-7-5 compilation區段的編譯設定
在<system.web>子標籤的<compilation>區
段,可以設定ASP.NET程式預設的編譯方式,如
下所示:
<configuration>
<system.web>
<compilation defaultLanguage="VB"
debug="true"/>
………
</system.web>
</configuration>

11-7-6 customErrors區段的自訂錯
誤網頁-說明

在<system.web>子標籤<customErrors>區
段,可以設定ASP.NET程式的自訂錯誤網頁。例
如:錯誤代碼HTTP 404,如下圖所示:
11-7-6 customErrors區段的自訂錯
誤網頁-指定錯誤網頁
在<customErrors>區段可以指定錯誤網頁,如
下所示:
<configuration>
<system.web>
<customErrors mode="On“
defaultRedirect="Ch11-7error.htm"/>
………
</system.web>
</configuration>

11-7-6 customErrors區段的自訂錯
誤網頁-指定錯誤代碼的錯誤網頁

在customErrors區段擁有多個error子標籤,每
一個error標籤可以定義HTTP錯誤代碼的自訂錯
誤網頁,如下所示:
<configuration>
<system.web>
<customErrors mode="On"
defaultRedirect="Ch11-7error.htm">
<error statusCode="404"
redirect="NotFoundError.htm"/>
</customErrors>
</system.web>
</configuration>
11-8 ASP.NET 2.0的網站設定工具


11-8-1 Web介面的網站管理工具
11-8-2 ASP.NET設定工具
11-8-1 Web介面的網站管理工具

在Visual Web Developer提供Web介面的
ASP.NET網站管理工具。請啟動VWD開啟Web
網站,例如:「Ch11」網站,然後執行「網站
/ASP.NET組態」指令,可以開啟瀏覽程式進入
Web介面管理工具,如下圖所示:
11-8-2 ASP.NET設定工具



如果電腦有安裝IIS,在安裝.NET Framework 2.0版後,
就會在Internet Information Services管理工具新增
ASP.NET設定工具。
請啟動Internet Information Services管理工具,在網
站虛擬目錄上,執行右鍵快顯功能表的【內容】指令,可
以看到「內容」對話方塊。
在【ASP.NET】標籤,按【編輯組態】鈕,可以看到
ASP.NET組態設定工具,如下圖所示: