-={ 熾天使書城 }=-

    ASP基礎教材

    【一、 關於 ASP】 【二、 ASP 的新功能】
    【三、 創建 ASP 頁】 【四、 使用腳本語言】
    【五、 使用變量和常量】 【六、 使用集合】
    【七、ASP內建對像】 【八、 向瀏覽器發送內容】
    【九、 包含文件】 【十、訪問數據庫】
    【十一、調試ASP腳本】 【十二、 維護 ASP 應用程序的安全】
    
    

    【一、 關於 ASP】 Active Server Pages(ASP)是服務器端腳本編寫 環境,使用它可以創建和運 行動態、交互的 Web 服務器應用程序。使用 ASP 可以組合 HTML 頁、腳本命令 和 ActiveX 組件以創建交互的 Web 頁和基於 Web 的功能強大的應用程序。ASP 應用程序很容易開發和修改。 HTML 編寫人員 如果您是位 HTML 編寫人員,您將發現 ASP 腳本提供了創建交 互頁的簡便方法。如果您曾想從 HTML 表格中收集數據,或用顧客的姓名個人化 HTML 文件,或根據瀏覽器的不同使用不同的特性,您會發現 ASP 提供了一個出 色的解決方案。以前,要想從 HTML 表格中收集數據,就不得不學習一門編程語 言來創建一個 CGI 應用程序。現在,您只要將一些簡單的指令嵌入到您的 HTML 文件中,就可以從表格中收集數據並進行分析。您再不必學習完整的編程語言或 者單獨編譯程序來創建交互頁。 隨著不斷掌握使用 ASP 和腳本語言的技巧,您可以創建更複雜的腳本。對於 ASP,您可以便捷地使用 ActiveX 組件來執行複雜的任務,比如連接數據庫以存 儲和檢索信息。 對 ASP 腳本的逐步介紹,請參閱 ASP 教程。然後您可以再回到這些主題中了解 關於編寫 ASP 腳本的詳細信息。 有經驗的腳本編寫人員 如果您已經掌握一門腳本語言,如 VBScript、JavaScript 或 PERL,而且您已 經了解使用 ASP 的方法。只要安裝了符合 ActiveX 腳本標準的相應腳本引擎, 就可以在 ASP 頁中使用任何一種腳本語言。ASP 帶有 Microsoft? Visual Basic? Scripting Edition (VBScript)和 Microsoft? JScript? 的腳本引擎,這樣 您可以立即開始編輯腳本。PERL、REXX 和 Python 的 ActiveX 腳本引擎可以從 第三方開發人員處獲得。 Web 開發人員 如果您已經掌握了一門編程語言,如 Visual Basic,您將發現 ASP 是快速創建 Web 應用程序的一個非常靈活的方 法。通過向 HTML 中添加腳本命令,您能夠創建應用程序的 HTML 接口。通過創 建自己的 ActiveX 組件,可以將應用程序中的商業邏輯封裝到能夠從腳本、其 他組件或從其他程序中調用的模塊。 使用 ASP 進行計算的 Web 可轉化為有形的利益,它使 Web 供應商能夠提供交 互的商業應用而不僅僅是發佈內容。例如,旅行社能夠比公佈航空時刻表做得更 多;用 ASP 腳本可以讓客戶察看現有的航班、比較費用並預定座位。 包含在 Windows NT Option pack 中的 Microsoft Transaction Server(MTS) 可以降低在服務器上構造程序的複雜性和費用。MTS 可以解決開發那些保密性強 的、可分級的以及可靠的 Web 應用程序的複雜性問題。 Active Server Pages模型 瀏覽器從 Web 服務器上請求 .asp 文件時,ASP 腳本開始運行。然後 Web 服務 器調用 ASP,ASP 全面讀取請求的文件,執行所有腳本命令,並將 Web 頁傳送 給瀏覽器。 由於腳本在服務器上而不是在客戶端運行,傳送到瀏覽器上的 Web 頁是在 Web 服務器上生成的。所以不必擔心瀏覽器能否處理腳本:Web 服務器已經完成了所 有腳本的處理,並將標準的 HTML 傳輸到瀏覽器。由於只有腳本的結果返回到瀏 覽器,所以服務器端腳本不易複製。用戶看不到創建他們正在瀏覽的頁的腳本命 令。 熾天使書城

    【二、 ASP 的新功能】 Active Server Pages 在功能方面有所增強,更易於開發應用程序。 Microsoft 腳本調試程序。 您可以使用腳本調試程序調試 .asp 文件。 請參閱 調試 ASP 腳本 事務性腳本。 ASP 頁和頁中使用的對象可以運行於事務環境之下。在 頁上的全部工作只有兩種結果:提交或終止。事務可以保護應用程序免於因失敗 而導致數據丟失。請參閱創建事務性腳本。 管理工具。 許多應用程序設置可在 Internet 服務管理器上進行,這 是 Internet Information Server 和 Personal Web Server(在 Windows NT Workstation 上)的管理工具。請參閱 配置 ASP 應用程序。 隔離 ASP 應用程序。 您可以隔離 ASP 應用程序以便它們能在 Web 服 務器上獨立的內存空間內運行。萬一某個應用程序失敗時,可以保護其他應用程 序和 Web 服務器。它也使您可以在不停止 Web 服務器的情況下,停止一個應用 程序或從內存中卸載其組件。請參閱隔離應用程序. 文件上載。 瀏覽器可以通過 Posting Acceptor 應用程序將文件上載 到 Web 服務器。可以編寫 ASP 腳本來發送帶有從 Posting Acceptor 傳來的信 息的 email,如每一個上載文件的位置和名稱。請參閱 Posting Accepter 文檔 (在 Microsoft Site Server Express 的目錄表中)。 新的 ASP 組件。 ASP 提供了新的基礎組件。有關概述請參閱 ActiveX 組件。 應用程序根目錄的改變。 ASP 應用程序的根目錄在您的 Web 站點上可 以是物理目錄。以前,根目錄必須映射為虛擬目錄。現在可以用 Internet 服務 管理器指示 ASP 應用程序的根目錄。請參閱創建應用程序。必須將 .asp 文件 置於應用程序樹中,Web 服務器才能檢測文件的改變並且自動重裝它們。 支持 Internet Explorer 4.0 通道和 Web 預測。 當 ASP 要發送包含 通道定義命令的文件時,它會自動告訴 Internet Explorer 4.0。使用 ASP 很 容易就能生成通道定義 (.cdf) 文件。 支持 HTTP 1.1 協議。 Internet Information Server 和 Personal Web Server 支持 HTTP 1.1 協議。在響應支持 HTTP 1.1 的瀏覽器(例如 Internet Explorer 4.0)時,這一支持可使 ASP 利用新協議的高效率。例如,當向瀏覽 器返回頁的時候,ASP 使用大塊轉換編碼以提高網絡效率。 熾天使書城

    【三、 創建 ASP 頁】 Active Server Pages(ASP)文件是以 .asp 為擴展名的文本文件,這個文本文 件可以包括下列部分的任意組合: 文本 HTML 標記 ASP 腳本命令 創建 .asp 文件非常容易。如果要在 HTML 文件中添加腳本,只需將該文件的擴 展名 .htm 或 .html 替換為 .asp 就可以了。要使 .asp 文件可用於 Web 用 戶,請將這個新文件保存在 Web 站點上的目錄中(請確定啟用了該目錄的腳本 和執行權限)。使用瀏覽器查看該文件時,可以看到 ASP 處理並返回了 HTML 頁。 現在可以在 .asp 文件中添加腳本命令了。 注意 因為 .asp 文件需要額外的處理,請不要將所有的 HTML 頁都轉換為 ASP 頁。應該只將包含腳本命令的文件轉換為 .asp 文件。.asp 和 .htm 文件可以 放置在相同的目錄中。 使用任何的文本編輯器都可以創建 .asp 文件。使用那些帶有 ASP 增強支持的 編輯器將更能提高效率,如 Microsoft? Visual InterDev? 。如果您從未使用 過 HTML,請考慮先使用 Microsoft FrontPage 。使用 FrontPage 創建文檔和 格式化文本就象使用文字處理工具一樣簡單。接下來還可以使用 Insert Script 命令在 FrontPage 創建的 HTML 頁中加入簡單的 ASP 命令。 加入 Script 命令 腳本是一系列的命令和指令。與 HTML 標簽不同,script 命令指示 Web 服務器 執行操作,而 HTML 標簽只是簡單地格式化文本或讀取圖形、視頻及音頻文件。 Script 命令可以在變量中存儲用戶名,在返回到瀏覽器的頁中顯示用戶名或將 用戶名存儲在數據庫中。 腳本命令通過定界符與文本區別開來。定界符是字符或一串字符,它標志單元開 始或結束。HTML 使用定界符棗小於號(<)和大於號(>)括入 HTML 標簽。 ASP 使用定界符 <% 和 %> 括入腳本命令。您可以在定界符中括入任何命令,只 要這些命令對正在使用的腳本語言有效。下面的例子展示了包含腳本命令的簡單 的 HTML 頁: This page was last refreshed on <%= Now %>. VBScript 函數 Now 返回當前的日期和時間。Web 服務器處理該頁時,會使用當 前的日期和時間替換 <%= Now %> 並且將該頁返回到瀏覽器: This page was last refreshed on 8/1/97 2:20:00 PM. 定界符括入的命令被稱為主腳本命令。這些命令被主腳本語言處理。在腳本定界 符中使用的任何命令都必須對主腳本語言有效。默認情況下,主腳本語言是 VBScript。要設置另一種語言。請參閱 使用腳本語言。 如果您已經熟悉了客戶端腳本編寫(編寫在瀏覽器上運行的腳本),請注意不要 用 HTML 大小寫敏感性 VBScript 不區分大小寫。例如,您可以用 Request 或 request 來引 用 ASP Request 對象。不區分大小寫的後果是您不能用大小寫來區分變量名。 例如,您不能創建兩個名為 Color 和 color 的單獨變量。 JScript 區分大小寫。要在腳本中使用 JScript 關鍵字,就必須按參 考頁中所示的大小寫來書寫。例如,用 date 來代替 Date 將導致錯誤。在 JScript 中,對像名必須大寫;方法名和屬性名可大寫也可小寫。本文所示的 ASP 內建對像的情況將在 JScript 命令中正常工作。 熾天使書城

    【五、 使用變量和常量】 變量是計算機內存中已命名的存儲位置,其中包含了數字或字符串等數 據。變量包含的信息被稱為變量的值。變量使用用戶便於理解腳本操作的名稱為 用戶提供了一種存儲、檢索和操作數據的途徑。 聲明和命名變量 命名和聲明變量應遵循腳本語言的規則及指導。即使在使用變量前不需 要去聲明變量,也應養成在編程時聲明變量的良好習慣,因為這樣有助於防止錯 誤發生。聲明一個變量意味著告訴腳本引擎,有一個特定名稱的變量,這樣就可 以在腳本中引用該變量。 VBScript VBScript 並不需要聲明變量,但在使用所有變量前聲明它們是一種好 的腳本書寫習慣。要在 VBScript 中聲明變量,請用 Dim、 Public 或 Private 語句。例如: <% Dim UserName %> 可以在需要顯式聲明變量的 .asp 文件中用 VBScript Option Explicit 語句。Option Explicit 必須在任何一個 ASP 指令之後及任何一個 HTML 文本或腳本命令之前出現。該語句僅影響用 VBScript 書寫的 ASP 命令, 而不會影響 JScript 命令。 關於這些命令的詳細信息,請參閱 VBScript 語言參考。 JScript Microsoft JScript 僅當變量為本地過程變量時才需聲明,但在使用 所有變量前聲明它們是一種好的腳本書寫習慣。要聲明一個變量,請使用 var 語 句。例如: <% var UserName; %> 有關 var 語句的詳細信息,請參閱 JScript 語言參考。 變量作用域 變量的作用域即生命期,決定哪些腳本命令可訪問變量。在過程內部聲 明的變量具有局部作用域。每執行一次過程,變量就被創建然後消亡。而過程外 部的任何命令都不能訪問它。在過程外部聲明的變量具有全局作用域,其值能被 ASP 頁上的任何腳本命令訪問和修改。 聲明變量時,局部變量和全局變量可以有相同的名稱。而改變其中一 個的值並不會改變另一個的值。如果沒有聲明變量,則可能不小心會改變一個全 局變量的值。例如,以下腳本命令返回值 1,雖然有兩個名為 Y 變量: <% Dim Y Y = 1 Call SetLocalVariable Response.Write Y Sub SetLocalVariable Dim Y Y = 2 End Sub %> 由於變量沒有顯式聲明,以下的腳本命令將返回 2。當過程調用將 Y 設 置為 2 時,腳本引擎認為該過程是要修改全局變量: <% Y = 1 Call SetLocalVariable Response.Write Y Sub SetLocalVariable Y = 2 End Sub %> 養成顯式聲明所有變量的編程習慣可以避免許多問題。尤其在當您用 #include 語句將文件包含進 ASP 主頁時,就顯得更為重要。一個獨立文件中被 包含的腳本是被當作整個包含它的文件的一部分來處理的。用不同的名稱來命名 主腳本和被包含腳本中用到的變量,這容易被遺忘,除非聲明變量。 為變量賦予會話或應用程序作用域 全局變量僅在單個 ASP 頁中可用,要使它在單個 ASP 頁之外可用,就 必須為變量賦予會話或應用程序作用域。會話作用域變量對一個用戶所請求的 ASP 應用程序中的所有頁都是可用的。應用程序作用域變量也如此。對單個用戶 來說,會話變量是存儲信息的最佳途徑,例如,首選項、用戶名或用戶標識。對 於一個特殊應用程序的所有用戶,應用程序作用域是存儲信息的最佳途徑,例如, 應用程序特定的問候語或應用程序所需的初始值。 ASP 提供兩個內建對像來讓您存儲變量:Session 對像和 Application 對象。 您也可以創建具有會話或應用程序作用域的對象實例。詳細信息,請參 閱設置對像作用域。 會話作用域 要為變量賦予會話作用域,將該變量存儲到 Session 對像中即可,方 法是為該對像的已命名條目指派一個值。例如,以下命令將兩個新的變量存儲到 Session 對像中。 <% Session(\"FirstName\") = \"Jeff\" Session(\"LastName\") = \"Smith\" %> 要 Session 對像中檢索信息,可以用輸出指令 (<%=) 或 Response.Write 訪問已命名的條目。以下示例用輸出指令顯示 Session(\"FirstName\") 的當前值: Welcome <%= Session(\"FirstName\") %> 可在 Session 對像中存儲用戶首選項,然後就可以訪問這些首選項, 從而決定將哪一頁返回給用戶。例如,您可以允許用戶在應用程序的第一頁指定 純文本內容,然後將這一選擇應用到用戶在該應用程序中訪問的所有後續頁。 <% If Session(\"ScreenResolution\") = \"Low\" Then %> This is the text version of the page. <% Else %> This is the multimedia version of the page. <% End If %> 應用程序作用域 要為變量賦予應用程序作用域,將該變量存儲到 Application 對像中 即可,方法是為該對像的已命名條目指派一個值。例如,以下命令將一個應用程 序特定的問候語存儲到Application 對像中: <% Application(\"Greeting\") = \"Welcome to Exploration Air\" %> 要從 Application 對像中檢索信息,可以使用 ASP 輸出指令 (<%=) 或 Response.Write 從該應用程序的任意後續頁中訪問已命名條目。以下示例用 輸出指令顯示 Application(\"Greeting\") 的值: <%= Application(\"Greeting\") %> 使用常量 常量是用來代替一個數或字符串的名稱。一些隨 ASP 提供的基本組件, 例如 ActiveX Data Objects (ADO),定義了您在腳本中可以使用的常量。組件 可在一個組件類型庫中聲明常量,組件類型庫是一個包含 ActiveX 組件所支持 的對象和類型的信息的文件。一旦在 Global.asa 文件中聲明了一個類型庫,您 就可以在該應用程序的任意頁中使用已定義的常量。 可在 Global.asa 中用 標記為應用程序聲明類型庫。例 如,要聲明 ADO 類型庫,可用以下語句: 這樣,您就可以在與 Global.asa 文件相同的應用程序的中使用 ADO 常量。在 下面的示例中,adOpenKeyset 和 adLockOptimistic 是 ADO 常量: \'Create and Open Recordset Object Set RsCustomerList = Server.CreateObject(\"ADODB.Recordset\") RsCustomerList.ActiveConnection = OBJdbConnection RsCustomerList.CursorType = adOpenKeyset RsCustomerList.LockType = adLockOptimistic 有關 標記的參考信息,請參閱 TypeLibrary 聲明。 在以前版本的 ASP 中,一些組件在文件中提供常量定義,每個使用那 些組件的 ASP 文件必須包含該文件。用 #include 指令來包含常量定義的用法 仍被支持,但使用類型庫通常更方便並且能使腳本更易於升級。在以後版本的 ASP 中,組件可能將不再提供常量定義文件。 您可以定義自己的常量。在 VBScript 中,用 Const 語句,在 JScript 中,用 var 語句。如果在多個 ASP 頁中使用常量,可在獨立的文件中放置常量, 然後將其包含進每一個使用該常量的 ASP 文件中去。 熾天使書城

    【六、 使用集合】 大多數 ASP 內建對像支持集合。集合是存儲字符串、數字、對像和其 他值的地方。除了在存儲或取出項目時集合會自動擴展與搜索外,集合與數組非 常相近。與數組不同的是,集合被修改後,項目的位置將會移動。可以通過集合 中項目的名稱、索引或者通過在集合的所有項目中遍歷訪問項目。 通過名稱和索引訪問項目 通過使用項目名稱可以訪問集合中的具體項目。例如,Contents 集合 擁有在 Session 對像中保存的所有變量。同樣也擁有由 Server.CreateObject 創建的所有對象。假設在 Session 對像中存儲了下列用戶信息: <% Session.Contents(\"FirstName\") = \"Sam\" Session.Contents(\"LastName\") = \"Woo\" Session.Contents(\"Age\") = 29 %> 可以使用在集合中存儲項目時關聯的名稱訪問項目。例如,下面的表達式返回字 符串「Sam\": <%= Session.Contents(\"FirstName\") %> 通過使用與項目關聯的索引或號碼也可以訪問項目。例如,下面的表達 式檢索存儲在 Session 對像的第二個存儲槽中的信息並且返回\"Woo\": <%= Session.Contents(2) %> ASP 集合從 1 開始編號。當在集合中增加或刪除項目時,與項目關聯 的索引將會改變。所以不能認為項目的索引始終不變。正如將在下面的主題中說 明的那樣,利用索引的訪問一般用來遍歷集合,或訪問只讀集合中的項目。 通過使用速記的名稱可以訪問項目。ASP 以特定的順序搜索與對像關聯 的集合。如果在對像的集合中特定名稱的項目只出現一次的話,可以消除該集合 的名稱: <%= Session(\"FirstName\") %> 訪問存儲在 Application 或 Session 對像中的項目時,消除集合名稱 一般是安全的。但是,對於 Request 對象,最好指定集合名稱,因為該集合很 可能包含重複的名稱。 遍歷集合 在集合的所有項目中遍歷可以了解集合中存儲的項目或修改項目。遍 歷集合時,必須提供集合名稱。例如,可以使用 VBScript 中的 For...Each 語 句訪問存儲在 Session 對像中的項目: <% \'Declare a counter variable. Dim Item \'For each item in the collection, display its value. For Each Item in Session.Contents Response.Write Session.Contents(Item) & \"
    \" Next %> 可以使用 VBScript 中的 For...Next 語句遍歷集合。例如,要列出上 例中存儲在 Session 中的三個項目,可以使用下列語句。 <% \'Declare a counter variable. Dim Item \'Repeat the loop until the value of counter is equal to 3. For Item = 1 to 3 Response.Write Session.Contents(Item) & \"
    \" Next %> 因為一般不知道存儲在集合中的項目個數,ASP 支持集合的 Count 屬 性,這個屬性返回集合中的項目數。可以使用 Count 屬性指定計數器的終值。 <% \'Declare a counter variable. Dim Item \'Repeat this loop until the counter equals the number of items \'in the collection. For Item = 1 to Session.Contents.Count Response.Write Session.Contents(Item) & \"
    \" Next %> 可以在腳本中使用 for 語句在集合中循環。在 JScript 的 for 語句 中使用 Count 屬性時,為了收到更大的效果,應該將 Count 值分配給本地變量 並使用該變量設置計數器終值。這樣,腳本引擎就不需要每次循環都查尋 Count 的值。下面的例子展示了這個技巧: <% var item, numitems; numitems = Session.Contents.Count; for (item = 1; item <= numitems; item++) { Response.Write(Session.Contents(item) + \"
    \") } %> Microsoft JScript 3.0 引入了 Enumerator 對象。可以使用該對像 遍歷 ASP 集合。atEnd 方法指出了集合中是否還存在項目。moveNext 方法移動 到集合中的下一個項目。 <% // Create an Enumerator object var mycoll = new Enumerator(Session.Contents); //Iterate through the collection and display each item while (!mycoll.atEnd()) { var x = mycoll.item(); Response.Write(Session.Contents(x) + \"
    \"); mycoll.moveNext(); } %> 遍歷帶子關鍵字 (Subkeys) 的集合 腳本在單一 cookie 中嵌入相關值以減少在瀏覽器和 Web 服務器之間 傳送的 cookie 數目。因此 Request 和 Response 對像的 Cookies 集合能夠在 單一項目中擁有多個值。這些子項目或子關鍵字可以被單個訪問。只有 Request.Cookies 和 Response.Cookies 集合支持子關鍵字 (Subkeys)。 Request.Cookies 只支持讀操作;Response.Cookies 只支持寫操作。 可以列舉 Request.Cookie 集合中所有的 cookie 以及 Cookie 中所 有的子關鍵字 (Subkeys)。但是,如果在沒有子關鍵字 (Subkeys) 的 Cookie 上 遍歷子關鍵字,將不會產生任何結果。通過使用 .HasKeys 語法首先檢查 cookie 是否含有子關鍵字 (Subkeys),就可以避免這種情況。下面的這個例子展示了這 個技巧。 <% \'Declare counter variables Dim Cookie, Subkey \'Display the entire cookie collection. For Each Cookie in Request.Cookies Response.Write Cookie & \"
    \" If Request.Cookies(Cookie).HasKeys Then \'Display the subkeys For Each Subkey in Request.Cookies(Cookie) Response.Write Subkey & \"=\" & Request.Cookies(Cookie)(Subkey) & \"
    \" Next Else Response.Write \"No subkeys in this cookie
    \" End If Next %> 遍歷對像集合 Session 和 Application 集合可以保存數量變量或者對像實例。 Contents 集合擁有數量變量和通過調用 Server.CreateObject 生成的對象實 例。StaticObjects 集合擁有在 Global.asa 文件中使用 HTML 元素 創建的對象。 在遍歷包含對像的集合時,可以訪問對像的標識符或對像的方法和屬 性。例如,假設應用程序使用一些對像創建用戶帳號,而且每個對像有初始化方 法,可以遍歷 StaticObjects 集合來調用每個初始化方法: <% For Each Object in Session.StaticObjects Session.StaticObjects(Object).InitializeUser Next %> ASP 集合有何不同之處? 儘管在本主題中討論的 ASP 集合與 Visual Basic 的 Collection 對 象非常相似,但還是有些不同。ASP 集合支持 Count 屬性和 Item 方法,但不 支持 Add 和 Remove 方法。 設置對像作用域 對像的作用域決定哪些腳本可以使用該對象。默認情況下,當您創建對 象實例時,該對像具有頁作用域。同一 ASP 頁中的任何腳本命令都能使用該頁 作用域的對象;當 ASP 頁送回客戶端時,該對像即被釋放。對大多數對像來說, 推薦的作用域是頁作用域。您可以改變一個對像的作用域,使其可被其他頁的腳 本使用。本主題將解釋如何使用頁作用域的對象以及如何改變對像的作用域。 使用頁作用域對像 在 ASP 頁上用 Server.CreateObject 創建的對象在該頁的生存期內 一直存在。該對像對該頁的任何腳本命令都是可訪問的,當 ASP 處理完該頁時, 該對像即被釋放。因此,對像具有該頁的作用域或生命周期。 在用 Visual Basic 或 VBScript 編程時,要注意在 ASP 處理完該頁 之前不要釋放對象。例如,以下語句經常用於通過將對像變量賦以 Nothing 值 來釋放對像: Set myObj = Nothing 如果您在 ASP 頁中包含了該語句,那麼任何使用 myObj 的企圖都將會 返回一個預期的錯誤代碼。但在內部,即使在對像釋放以後,ASP 仍保留對它的 引用。當您在腳本中不能使用對像時,對像的資源直到 ASP 處理完頁之後才釋 放。同樣,如果您通過創建另一個對像實例並將其賦給已使用過的對象變量來釋 放該對像時,ASP 將保留對原對像實例的引用。對大多數腳本來說,創建多個對 象可能不會產生問題,但如果對像使用共享資源,比如數據庫連接,就有可能出 現問題。 由於對像有頁作用域,所以不要依靠手工釋放的對象。例如,以下的循 環創建 1001 個 Connection 對象,它將能打開大多數的連接甚至於一個大型的 SQL server: <% For I = 0 to 1000 Set Conn = Server.CreateObject(\"ADODB.Connection\") Conn.Open \"connection string\" Next %> 總的來說,應該盡量避免在一個循環內部創建對象。如果無法避免,您應 該手工釋放被對像使用過的資源。如果 Connection 對像僅被創建一次,且數據 資源的物理連接在每個循環中被打開然後關閉,那麼上例將會正常運行: <% Set Conn = Server.CreateObject(\"ADODB.Connection\") For I = 0 to 1000 Conn.Open \"connection string\" Conn.Close Next %> 為對像賦予會話作用域 在應用程序中,對於每個新會話,都會創建 session-scope 對象,並 且在會話結束後會將其釋放。因此,每個活動的會話都有一個對象。會話作用域 用於從多個腳本中調用的對象,但只影響一個用戶會話。您可以只在需要時才為 對像賦予會話作用域。如果確實需要使用會話作用域,那麼就必須了解提供對像 的組件的線程模型,因為它影響性能和對像的安全環境。詳細信息,請參閱本主 題的「高級信息:性能問題」 。 要為對像賦予會話作用域,請將對像存儲在 ASP Session 內建對像 中,您既可以在 Global.asa 文件中使用 標記,也可以在 ASP 頁上 使用 Server.CreateObject 方法創建具有會話作用域的對象實例。 在 Global.asa 文件中,您可用擴展了 RUNAT 屬性(必須設置為 Sever)和 SCOPE 屬性(必須設置為 Session)的 ;OBJECT> 標記。以下示例創建一個 Ad Rotator 對像的會話作用域實例: 一旦您在 Session 對像中存儲了對象,您就可以從應用程序的任何頁中 訪問該對象。下面的語句使用上例中由 標記創建的對象實例: <%= MyAd.GetAdvertisement(\"addata.txt\") %> 在 ASP 頁上,您也可以使用 Server.CreateObject 方法將對像存儲在 Session 內建對像中。以下示例在 Session 對像中存儲 Ad Rotator 對像的一 個實例。 <% Set Session(\"MyAd\") = Server.CreateObject(\"MSWC.Adrotator\") %> 要顯示廣告,您首先應該獲取存儲在 Session 對像中的 Ad Rotator 對像的實例,然後才能調用方法來顯示對像: <% Set MyAd = Session(\"MyAd\") %> <%= MyAd.GetAdvertisement(\"addata.txt\") %> 在用 標記聲明的對象被某個 .asp 文件中的腳本命令引用 之前,ASP 並不創建其實例。Server.CreateObject 方法則立即創建該對像實例。 因此,對會話作用域對像來說,使用 標記要比 Server.CreateObject 屬性更好。 為對像賦予應用程序作用域 application-scope 對像是在應用程序啟動時就創建的對象的單個實 例。該對像由所有客戶端請求共享。僅在極少數情況下,您才需要為對像賦予應 用程序作用域。一些實用程序對象,例如計數器等,可能需要應用程序作用域。 但一般來說,您可用在下一節中建議的替代方案。另外,線程模型會影響性能和 對像安全環境(請參閱本主題的「高級信息:性能問題」)。 要為對像賦予應用程序作用域並將其存儲在 ASP Application 內建 對像中,既可以使用 Global.asa 文件中的 標記,也可以使用 ASP 頁 上的 Server.CreateObject 方法創建應用程序作用域的對象實例。 在 Global.asa 文件中,您可用擴展了 RUNAT 屬性(必須設置為 Sever)和 SCOPE 屬性(必須設置為 Session)的 ;OBJECT> 標記。在 ASP 頁 中,您可以使用 Server.CreateObject 將對像實例存儲在 Application 內建對 象中。關於使用 標記和 Server.CreateObject 的示例,請參閱上一 節\"為對像賦予會話作用域\"。 會話和應用程序作用域的替代方案 僅當需要時,才能為對像賦予會話或應用程序作用域。因為在會話或 應用程序結束運行之前,這些對像會一直保留。它們會占用內存或數據庫連接等 資源,這些資源可能會在其他方面更有用。另外,組件的線程模型會影響您從中 所創建的對象的性能,尤其是那些具有會話或應用程序作用域的對象。 在很多情況下,比創建應用程序或會話作用域對像更好的方法就是利用 會話或應用程序作用域變量,將信息傳遞給在網頁一級創建的對象。例如,不要 為 ADO Connection 對像賦予會話或應用程序作用域,因為它創建的連接會在相 當長的一段時間一直保持打開而此時腳本已不再使用 ODBC 連接共享。但您可以 將 ODBC 連接字符串存儲在 Session 或 Application 內建對像中,並在網頁上 從創建的 Connection 對像實例中獲取該字符串。通過這種方式,您可以存儲在 會話或應用程序名稱空間中頻繁使用的信息,但只有在需要時才創建用該信息的 對象。關於作用域變量的詳細信息,請參閱「使用變量和常量」。 用戶自定義的 JScript 對像 您可以通過定義一個創建和初始化新對像的屬性和方法的構造函數來 創建自己的 JScript 對象。當腳本用 new 操作符來調用構造函數時,就會創建 該對像的實例。ASP 腳本支持用戶自定義的對象,當具有頁作用域時,後者正常 運行。但如果為用戶自定義的 JScript 對像賦予應用程序或會話作用域,將可 能影響該對像的功能。特別是,若一個對像具有會話或應用程序作用域,則其他 頁的腳本可以獲取該對像的屬性,但是卻不能調用其方法。 高級信息:性能問題 組件的線程模型可能會影響 Web 站點的性能,一般來說,帶有 Both 標記的對象是推薦在所有的 ASP 腳本中使用的對象,尤其是在 Session 和 Application 對像中。不推薦使用單線程對象。 因為您可能不會始終控制所用對像的線程模型,所以,以下的指導可幫助您獲得 最佳性能: 頁作用域對象。帶有 Both 或 Apartment 標記的對象將給予您最佳的 性能。 應用程序作用域對象。一般來說,應避免在 Application 對像中放置 對象。如果確需使用應用程序作用域對象,您會從結合了 FreeThreadedMarshaler 的帶有 Both 標記的對象中獲得最佳性能。您既可以用 標記也可以用 Server.CreateObject 方法在 Application 對像中存 儲帶有 Single、Free 或 Both 標記的對象。您必須用單元線程對像來使用 標記。 會話作用域對象。帶有 Both 標記的對象將為您提供最佳性能。用 單線程或單元線程對像會導致 Web 服務器將會話鎖定在一個線程上。自由線程 對像不會鎖定會話,但運行速度不高。在 Session 對像中,您可以用 標記或 Server.CreateObject 方法存儲對像 。 如果您已安裝了 SDK 文檔,請參閱\"創建 ASP 組件」,您將會獲得有 關線程模型及其隱含的組件性能的詳細信息。(在 Windows 95 及其後續版本中 SDK 文檔不可用。) 熾天使書城

    【七、ASP內建對像】 Active Server Pages 提供內建對象,這些對像使用戶更容易收集通過瀏覽器請 求發送的信息、響應瀏覽器以及存儲用戶信息(如用戶首選項)。本文簡要說明 每一個對象。有關每個對像的詳細信息,請參閱內建對像參考。 Application 對像 可以使用 Application 對像使給定應用程序的所有用戶共享信息。 Request 對像 可以使用 Request 對像訪問任何用 HTTP 請求傳遞的信息,包括從 HTML 表格 用 POST 方法或 GET 方法傳遞的參數、cookie 和用戶認證。Request 對像使您 能夠訪問發送給服務器的二進制數據,如上載的文件。 Response 對像 可以使用 Response 對像控制發送給用戶的信息。包括直接發送信息給瀏覽器、 重定向瀏覽器到另一個 URL 或設置 cookie 的值。 Server 對像 Server 對像提供對服務器上的方法和屬性進行的訪問。最常用的方法是創建 ActiveX 組件的實例 (Server.CreateObject)。其他方法用於將 URL 或 HTML 編碼成字符串,將虛擬路徑映射到物理路徑以及設置腳本的超時期限。 Session 對像 可以使用 Session 對像存儲特定的用戶會話所需的信息。當用戶在應用程序的 頁之間跳轉時,存儲在 Session 對像中的變量不會清除;而用戶在應用程序中 訪問頁時,這些變量始終存在。也可以使用 Session 方法顯式地結束一個會話 和設置空閒會話的超時期限。 ObjectContext 對像 可以使用 ObjectContext 對像提交或撤消由 ASP 腳本初始化的事務。 Application 對像 集合: Contents StaticObjects 方法: Lock Unlock 事件: Application_OnEnd Application_OnStart ObjectContext 對像 方法: SetAbort SetComplete 事件: OnTransactionAbort OnTransactionCommit Request 對像 集合: ClientCertificate Cookies Form QueryString ServerVariables 屬性: TotalBytes 方法: BinaryRead Response 對像 集合: Cookies 屬性: Buffer CacheControl Charset ContentType Expires ExpiresAsolute IsClientConnected PICS Status 方法: AddHeader AppendToLog BinaryWrite Clear End Flush Redirect Write Server 對像 屬性: ScriptTimeout 方法: CreateObject HTMLEncode MapPath URLEncode Session 對像 集合: Contents StaticObjects 屬性: CodePage LCID SessionID Timeout 方法: Abandon 事件: Session_OnEnd Session_OnStart --------------------------------------------------------------------- ------ ActiveX 組件 本部分概述了 Active Server Pages(ASP)中的 ActiveX 組件。有關這些組件 的完整介紹及其對像、屬性和方法的列表,請參閱可安裝的 ASP 組件。 ActiveX 組件作為基於 Web 的應用程序部分在 Web 服務器上運行。組件提供了 應用程序的主要功能(如訪問數據庫),這樣就不必創建或重新創建執行這些任 務的代碼。 數據庫訪問 可以使用 Database Access 組件在應用程序中訪問數據庫。然後可以顯示表的 整個內容、允許用戶構造查詢以及在 Web 頁執行其他一些數據庫查詢。 Ad Rotator 可以使用 Ad Rotator 組件來交替顯示圖像,並提供從顯示的圖形到另一個 URL 的鍊接。在文本文件中保存廣告列表;Ad Rotator 組件依照在數據文件中的指 令來顯示它們。 Content Rotator Content Rotator 組件 在 Web 頁上自動循環 HTML 內容字符串。每次用戶請求 Web 頁時,Content Rotator 組件基於 Content Schedule 文件中指定的信息顯 示新的 HTML 內容字符串。 由於內容字符串可以包含 HTML 標記,就可以顯示 HTML 能夠表示的任何內容類 型:文本、圖形或超文本鍊接。例如,可以使用該組件在每日牌價或超文本鍊接 中循環,或者在每次打開 Web 頁時,改變文本和背景的顏色。 Browser Capabilities 通過使用 Browser Capabilities 組件,可以基於瀏覽器的功能剪裁發送到該瀏 覽器的內容。 File Access File Access 組件提供可用於在計算機文件系統中檢索和修改文件的對象。 Content Linking Content Linking 組件使在應用程序中提供 .asp 文件的邏輯導航變得簡單易 行。不用在許多 .asp 文件中維護 URL 引用,而只需在易於編輯的文本文件中 指定 .asp 文件的次序組織。 Collaboration Data Objects for Windows NT Server Collaboration Data Objects for NTS 組件 提供 Web 應用程序所使用的郵件 對象。這個庫使您能夠簡單快捷地在應用程序上添加收發郵件的功能。您可以創 建可編程郵件對象,然後利用它們的屬性和方法來滿足應用程序的需要。 MyInfo、Status、System 和 Tools MyInfo、Status、System 和 Tools 組件為在 Macintosh 上和在運行 Microsoft Windows 的計算機上開發的應用程序提供兼容性。 MyInfo 組件跟蹤 Web 站點所有者的個人信息,如經營 Web 站點的組織名稱和 地址及 Web 站點的設置,還有 Web 站點是否有 guest book。 Status 組件跟蹤 Web 站點的信息,如訪問者的數量以及 HTTP 連接的個數。 System 組件創建包含服務器狀態信息的 status 對象。當前該服務器狀態只在 Personal Web Server for Macintosh 上可用。 Tools 組件提供了生成隨機數、檢查文件是否存在或處理 HTML 表格的方法。 Page Counter Page Counter 組件 統計並顯示 Web 頁被請求的次數。以一定的時間間隔,將 捕獲的數字寫入到文本文件中,這樣服務器關閉後,數據也不會丟失。 Permission Checker Permission Checker 組件測試 Web 用戶對某文件或某頁的訪問權。可以使用 Permission Checker 組件為不同類型的用戶定製基於 ASP 的頁。例如,如果 Web 頁包含超文本鍊接,就可以使用 Permission Checker 組件測試用戶對相應 Web 頁的訪問權限並忽略用戶無權訪問的頁或使這些鍊接失效 熾天使書城

    【八、 向瀏覽器發送內容】 在處理 ASP 腳本時,任何沒有包含在 ASP 定界符或 使用腳本語言的這個功能,您能夠創建令人興奮的應用程序。舉例來說,下面的 腳本將生成在用戶的 Web 瀏覽器上運行的客戶腳本的子程序。 <% ServerTime = Time ServerDate = Date For i = 1 to 4 Randomize GreetCondition = int(rnd * 3) %>
    <% Next %> 在以上的腳本中,ASP 在服務器上檢索時間和日期信息,然後通過幾次循環生成 在用戶的 Web 服務器上運行的子程序。每個客戶端子程序提出隨機選擇的問候, 顯示時間和日期信息。 這種腳本可擴展,例如,將配置信息檢索並提交到指定的客戶端腳本或組件,如 ActiveX 控件。靈活地使用這種腳本的編寫技巧,同樣可以加快 Web 服務器處 理和返回用戶信息請求的速度。  熾天使書城

    【九、 包含文件】 SSI 指令為用戶提供在 Web 服務器處理之前將一個文件的內容插入到 另一個文件的方法。ASP 只使用這一機制的 #include 指令。要在 .asp 文件中 插入一個文件,使用下面的語法: virtual 和 file 關鍵字指示用來包含該文件的路徑的類型,filename 是您想 包含的文件的路徑和名稱。 被包含文件不要求專門的文件擴展名;但是,為被包含文件賦予 .inc 擴展名以 便和其他類型文件相區分是一個良好的編程習慣。 使用 Virtual 關鍵字 使用 Virtual 關鍵字指出路徑開始於虛擬目錄。例如,如果一個被命名為 Footer.inc 的文件屬於一個名為 /Myapp 的虛擬目錄,則下面的一行將把 Footer.inc 的內容插入到包含該行的文件中: 使用 File 關鍵字 使用 file 關鍵字指示使用相對路徑。相對路徑開始於含有該包含文件的目錄。 例如,如果您的文件位於目錄 Myapp 中,而文件 Header1.inc 在 Myapp\\Headers 中,下面的一行將把 Header1.inc 插入到您的文件中: 注意,到被包含文件 Headers/header1.inc 的路徑是相對於包含文件的;如果 包含 #include 語句的腳本不在 /Myapp 目錄中,那麼該語句將不起作用。 如果在 Internet 服務管理器中的\"啟用上層目錄\"選項被選中,則也可以使用 file 關鍵字和 ../ 語法包含父目錄即上一層目錄中的文件。有關命令,請參閱 配置 ASP 應用程序。 被包含文件的位置 被包含文件可以在您的 Web 站點內的某個目錄中,也可以在您的 Web 站點之 外。通常,您應該使被包含文件位於 Web 站點的目錄中。如果一個被包含文件 位於您的 Web 站點內,則當瀏覽器下次請求包含文件時,將顯示對被包含文件 的改變。但是,如果被包含文件位於您的 Web 站點之外,直到 ASP 應用程序重 新啟動或 Web 服務器重新啟動時,這種改變才能體現出來。ASP 檢測在應用程 序命名空間中(在應用程序的起始目錄下)的任何包含文件的改變。 包含文件:提示和警告 一個被包含文件也可以包含其他的文件。如果 #include 指令沒有導致循環,一 個 .asp 文件可以多次包括同一個文件。例如,如果文件 First.asp 包含文件 Second.inc,則 Second.inc 一定不能再包含 First.asp。一個文件也不能包含 自身。ASP 檢測此類循環或嵌套錯誤,並在檢測到時產生一個錯誤消息,同時停 止處理被請求的 .asp 文件。 ASP 在執行腳本命令之前包含文件。因此,不能用腳本命令去創建被包含文件的 名稱。例如,下面的腳本將不能打開 Header1.inc,因為 ASP 會在它分配一個 文件名給變量 name 之前先執行 #include 指令。 <% name=(header1 & \".inc\") %> 腳本命令和過程必須完全包含在腳本定界符 <% 和 %> 、HTML 標記 或 HTML 標記 和 中。也就是說,不能在一 個 .asp 包含文件中打開一個腳本定界符,然後在一個被包含的文件中才關閉該 定界符;腳本或腳本命令必須是一個完整的單元。例如,下面的腳本將無法運行: <% For i = 1 To n statements in main file Next %> 下面的腳本將正常運行: <% For i = 1 to n statements in main file %> <% Next %> --------------------------------------------------------------------- ----------- 使用 HTML 表格 使用 ASP Request 對象,您可以創建一個簡單而功能強大的腳本來收集和處理 HTML 表格數據。在本主題中,您將不僅學會如何創建基本的表格處理腳本,而 且還將獲得用於驗證 Web 服務器和用戶瀏覽器上的表格信息的一些有用技術。 關於 HTML 表格 HTML 表格是收集 Web 信息最常用的方法,是在 Web 頁上提供用戶界面控件的 特殊的 HTML 標記的排列。文本框、按鈕和復選框都是典型的控件,這些控件使 用戶和 Web 頁實現交互,並且將信息提交給 Web 服務器。 下面的 HTML 示例產生一個表格,在表格中,用戶可以輸入姓名、年齡並包含一 個將這些信息提交給 Web 服務器的按鈕。該表格也包含了一個隱含的控件(Web 瀏覽器不顯示),可以用該控件向 Web 瀏覽器傳遞附加信息。
    處理 ASP 輸入的表格 在表格向 Web 服務器提交信息時,用戶的 Web 瀏覽器請求用 HTML
    標 記的 ACTION 屬性所指定的 .asp 文件(在前面的例子中,該文件被稱為 Myfile.asp)。.asp 文件包含了處理表格值(如顯示結果表或從數據庫查詢信 息)的腳本。 可以通過三種途徑用 .asp 文件收集 HTML 表格的值 靜態的 .htm 文件可以包含一個將其數值郵送給 .asp 文件的表格。 .asp 文件可以創建一個將其信息郵送給另一個 .asp 文件的表格。 .asp 文件可以創建一個將其信息郵送給自身的表格,即包含該表格的文件。 前兩個方法的操作方式相同,當表格與網關程序交互時,除 ASP 之外,可以包 含讀取和響應用戶選擇的命令。 創建一個包含表格定義且傳送信息給自身的 .asp 文件較複雜,但卻是有很強功 能的處理表格的方法。這一過程在驗證表格輸入 中演示。 獲得表格輸入 ASP Request 對像提供了兩種集合,在很大程度上簡化了檢索附加在 URL 請求 上的表格信息的任務。 QueryString 集合 QueryString 集合獲取作為跟在請求的 URL 的問號後面的文本傳遞給 Web 服 務器的值。通過使用 HTTP GET 方法或手工將表格的值添加到 URL,表格的值可 以被附加在請求的 URL 之後。 例如,如果先前的表格示例使用 GET 方法 (ACTION = \"GET\") 且用戶鍵入 Jeff、 Smith 和 30,那麼下面的 URL 請求將被發送給服務器: http://scripts/Myfile.asp?firstname=Jeff&lastname=Smith&age=30&userst atus=new Myfile.asp 包含下面的表格處理腳本: Hello, <%= Request.QueryString(\"firstname\") %> <%= Request.QueryString(\"lastname\") %>. You are <%= Request.QueryString(\"age\") %> years old. <% If Request.QueryString(\"userstatus\") = \"new user\" then Response.Write\"This is your first visit to this Web site!\" End if %> 在這種情況下,Web 服務器將返回下面的文本給用戶的 Web 瀏覽器: Hello, Jeff Smith. You are 30 years old. This is your first visit to this Web site! QueryString 集合有一個可選參數,可用來訪問顯示在請求正文中的多個值中的 一個。也可以使用 Count 屬性計算一個特殊類型的值的出現次數。 例如,表格包含一個多項目的列表框可以提交下面的請求: http://list.asp?food=apples&food=olives&food=bread 您也可以使用下面的命令去對多個值計數: Request.QueryString(\"food\").Count 如果想顯示多個值的類型,List.asp 應包含下面的腳本; <%Total = Request.QueryString(\"food\").Count%> <%For i = 1 to Total%> <%= Request.QueryString(\"food\")(i) %>
    <%Next%> 上述腳本將顯示: apples olives bread Form 集合 當使用 HTTP GET 方法去向 Web 服務器傳遞長而複雜的表格值時,將可能丟失 信息。大多數的 Web 服務器傾向於嚴格控制 URL 查詢字符串的長度,以便用 GET 方法傳送的冗長的表格值被截斷。如果您需要從表格發送大量信息到 Web 服務器,就必須使用 HTTP POST 方法。此法用於在 HTTP 請求正文中發送表格 數據,而且發送的字符的個數可以無限多。也可以使用 ASP Request 對像的 Form 集合檢索用 POST 方法發送的值。 Form 集合與 QueryString 集合存儲數值的方式相同。例如,如果用戶用一長串 名稱填充表格,您就可以用下面的腳本檢索這些名稱: <% For i = 1 to Request.Form.Count %> <% =Request.Form(\"names\")(i) %> <% Next %> 驗證表格輸入 一個好的表格處理腳本在處理數據前,應先驗證輸入表格的信息是否有效。驗證 腳本可以檢驗用戶輸入到表格的信息類型是否正確。例如,如果您的 Web 站點 包含一個表格,該表格允許用戶計算財務信息,那麼在處理結果之前,需要驗證 用戶確實輸入了數值信息而不是文本。 一個非常方便的驗證表格輸入的方法是創建一個向自身傳遞信息的表格。在這種 情況下,.asp 文件包含可獲取信息的表格。例如,下面的腳本通過向自身傳遞 信息來驗證用戶是否在 \"age\" 表格字段中輸入了數值: <% If Isnumeric(Request.QueryString(\"Age\")) then %>

    Hello, your age is <%=Request.QueryString(\"age\")%> <%Else %>

    Please enter a numerical age. <%End If %> Name: Age:

    在這個例子中,腳本也在包含表格的同一 Verify.asp 文件中。表格通過在 ACTION 屬性中指定 Verify.asp 向自身傳送信息。 您也可以創建客戶端腳本來檢驗用戶是否輸入了有效的信息。驗證用戶在 Web 瀏覽器上的輸入除了更迅速地向用戶提示表格項錯誤外,還可以減少 Web 服務 器的網絡流量。下面的腳本運行在用戶的 Web 瀏覽器上,在將信息提交到 Web 服務器之前,驗證用戶信息。
    Name: Age:
    熾天使書城

    【十、訪問數據庫】 ActiveX Data Objects (ADO) 是一項容易使用並且可擴展的將數據庫 訪問添加到 Web 頁的技術。可以使用 ADO 去編寫緊湊簡明的腳本以便連接到 Open Database Connectivity (ODBC) 兼容的數據庫和 OLE DB 兼容的數據源。 如果您是一個對數據庫連接有一定了解的腳本編寫人員,那麼您將發現 ADO 命 令語句並不複雜而且容易掌握。同樣地,如果您是一個經驗豐富的數據庫編程人 員,您將會正確認識 ADO 的先進的與語言無關性和查詢處理功能。 創建 ODBC DSN 文件 在創建數據庫腳本之前,必須提供一條使 ADO 定位、標識和與數據庫通訊的途 徑。數據庫驅動程序使用 Data Source Name (DSN) 定位和標識特定的 ODBC 兼 容數據庫,將信息從 Web 應用程序傳遞給數據庫。典型情況下,DSN 包含數據 庫配置、用戶安全性和定位信息,且可以獲取 Windows NT 註冊表項中或文本文 件的表格。 通過 ODBC,您可以選擇希望創建的 DSN 的類型:用戶、系統 或 文件。用戶和 系統 DSN 存儲在 Windows NT 註冊表中。系統 DSN 允許所有的用戶登錄到特定 的服務器上去訪問數據庫,而用戶 DSN 使用適當的安全身份證明限制數據庫到 特定用戶的連接。文件 DSN 用於從文本文件中獲取表格,提供了對多用戶的訪 問,並且通過複製 DSN 文件,可以輕易地從一個服務器轉移到另一個服務器。 由於以上原因,本主題中的示例將使用文件 DSN。 通過在 Windows 的\"開始\"菜單打開\"控制面板\",您可以創建基於 DSN 的文 件。雙擊「ODBC\"圖標,然後選擇\"文件 DSN\"屬性頁,單擊\"添加\",選擇數 據庫驅動程序,然後單擊\"下一步\"。按照後面的指示配置適用於您的數據庫軟 件的 DSN。 配置 Microsoft Access 數據庫的文件 DSN 在「創建新數據源」對話框中,從列表框選擇「Microsoft Access Driver\", 然後單擊\"下一步\"。 鍵入您的 DSN 文件名,然後單擊\"下一步\"。 單擊「完成」創建數據源。 在「ODBC Microsoft Access 97 安裝程序\"對話框中,單擊\"選擇\"。選擇 Microsoft Access 數據庫文件 (*.mdb),然後單擊\"確定\"。 注意由於性能和可靠性的原因,我們極力推薦您使用「客戶-服務器數據庫引擎\" 配置由這樣一種 Web 應用程序驅動的數據,這些 Web 應用程序必須滿足 10 個 以上的用戶的同時訪問。儘管 ASP 可以使用任何 ODBC 兼容的數據庫,但它是 為使用客戶-服務器數據庫而設計的,而且經過了嚴格的測試,這些數據庫包括 Microsoft ? SQL Server、Oracle 等。 ASP 支持共享文件數據庫(如 Microsoft ? Access 或 Microsoft ? FoxPro) 作為有效的數據源。儘管在 ASP 文檔中的一些示例使用共享文件數據庫,但我 們建議只將此類數據庫引擎用於開發或有限的配置方案。共享文件數據庫可能無 法很好地適用於可滿足高需求、高質量的 Web 應用程序的客戶-服務器數據庫。 配置 SQL Server 數據庫文件 DSN   注意如果數據庫駐留在遠程服務器上,請與服務器管理員聯繫,獲取附加的配置 信息;下面的過程使用 SQL Server 的 ODBC 默認的設置,它可能不適用於您的 硬件配置。 在「創建新數據源」對話框中,從列表框中選擇「SQL Server\",然後單擊\"下 一步\"。 鍵入 DSN 文件的名稱,然後單擊\"下一步\"。 單擊「完成」創建數據源。 鍵入運行 SQL 服務程序的服務器的名稱、登錄 ID 和密碼。 在「創建 SQL Server 的新數據源\"對話框中,在\"服務器\"列表框中鍵入包含 SQL Server 數據庫的服務器的名稱,然後單擊\"下一步\"。 選擇驗證登錄 ID 的方式。 如果要選擇 SQL 服務器驗證,請輸入一個登錄 ID 和密碼,然後單擊\"下一 步\"。 在「創建 SQL Server 的新數據源\"對話框中,設置默認數據庫、存儲過程設置 的驅動程序和 ANSI 標識,然後單擊\"下一步\"。(要獲取詳細信息,請單擊\"幫 助\"。) 在對話框(同樣名為「創建 SQL Server 的新數據源」)中,選擇一種字符轉換 方法,然後單擊「下一步」。(詳細信息,請單擊「幫助」。) 在下一個對話框(同樣名為「創建 SQL Server 的新數據源\")中,選擇登錄設 置。 注意 典型情況下,您只能使用日志來調試數據庫訪問問題。 在「ODBC Microsoft SQL Server 安裝程序」對話框中,單擊「測試數據源」。 如果 DSN 正確創建,\"測試結果\"對話框將指出測試成功完成。 SQL server 連接和安全信息 如果您正在開發用於連接遠程 SQL Server 數據庫的 ASP 數據庫應用程序,應 考慮以下問題: 連接方案- 您可以選擇 TCP/IP 套接字和命名管道的方法訪問遠程的 SQL Server 數據庫。當使用命名管道時,因為在建立連接之前,數據庫用戶必須被 Windows NT 確認,所以對只有適當的 SQL Server 訪問身份而在該計算機上沒 有 Windows NT 用戶帳號的用戶可能會被拒絕訪問命名管道。作為一種替代方 案,使用 TCP/IP 套接字的連接可直接連接到數據庫服務器,而不必通過使用命 名管道的中間計算機。因為使用 TCP/IP 套接字連接可直接連接到數據庫 server,所以通過 SQL Server 的確認,用戶就可以獲得訪問權,而不必通過 Windows NT 的確認。 注意 在連接到遠程數據庫時使用 TCP/IP 套接字可提高性能。 安全性 - 如果您使用 SQL Server 的 集成或 混合 安全特性,並且 SQL Server 數據庫位於遠程服務器上,則不能使用 Windows NT 請求/響應的確認。也就是 說,不能將 Windows NT 請求/響應身份證轉發到遠程計算機上,而只能使用基 本身份驗證,它根據用戶提供用戶名和口令信息進行。 有關這一主題的詳細信息,請參閱 http://www.microsoft.com/sqlsupport/ 上的 Microsoft SQL Server 技術支持主頁。 配置 Oracle 數據庫文件 DSN 首先要確保 Oracle 用戶軟件被正確地安裝要創建 DSN 的計算機上。詳細信息, 請與服務器管理員聯繫或參閱數據庫軟件文檔。 在「創建新數據源」對話框中,從列表框中選擇「Microsoft ODBC for Oracle\", 然後單擊\"下一步\"。 鍵入 DSN 文件的名稱,然後單擊\"下一步\"。 單擊「完成」創建數據源。 輸入用戶名、密碼和服務器名,然後單擊「確定」。 注意 DSN 文件用 .dsn 擴展名,位於 \\Programs\\Common Files\\ODBC\\Data Sources 目錄中。 有關創建 DSN 文件的詳細信息,請訪問 Microsoft ODBC Web 站點: http://microsoft.com/odbc/。 連接數據庫 訪問數據庫信息的第一步是和數據庫源建立連接。ADO 提供 Connection 對象, 可以使用該對像建立和管理應用程序和 ODBC 數據庫之間的連接。Connection 對像具有各種屬性和方法,可以使用它們打開和關閉數據庫連接,並且發出查詢 請求來更新信息。 要建立數據庫連接,首先應創建 Connection 對像的實例。例如,下面的腳本創 建 Connection 對象,接著打開數據庫連接: <% \'Create a connection object Set cn = Server.CreateObject(\"ADODB.Connection\") \'Open a connection; the string refers to the DSN cn.Open \"FILEDSN=MyDatabase.dsn\" %> 注意 無論在等號 (=) 之前還是之後,DSN 字符串都不能包含空格。 在這種情況下,Connection 對像的 Open 方法引用基於 DSN 的文件,其中包含 關於數據庫的位置和配置信息。也可以不引用 DSN,直接顯式引用供應程序、數 據源、用戶 ID 和密碼。有關建立連接的可選方法的詳細信息,請參閱 Microsoft ActiveX Data Objects (ADO)。 用 Connection 對像執行查詢 用 Connection 對像的 Execute 方法,您可以發出結構化查詢語言 (SQL) 查詢 數據庫源並檢索結果。SQL 是用於與數據庫通訊的工業標準語言,它有許多命令 可用來檢索和更新信息。 下面的腳本使用 Connection 對像的 Execute 方法在 SQL INSERT 命令的表格 中發出查詢,該命令將數據插入特定的數據庫表格。在下面的示例中,腳本將名 稱 Jose Lugo 插入名為 Customers 的數據庫表中。 <% \'Define file based DSN strDSN = \"FILEDSN=MyDatabase.dsn\" \'Instantiate the Connection object and open a database connection Set cn = Server.CreateObject(\"ADODB.Connection\") cn.Open strDSN \'Define SQL SELECT statement strSQL = \"INSERT INTO Customers (FirstName, LastName) VALUES (\'Jose\',\'Lugo\')\" \'Use the Execute method to issue a SQL query to database cn.Execute(strSQL) %> 注意 基於 DSN 路徑字符串的文件在等號(=)前後不應包含空格。 除了 SQL INSERT 命令以外,您也可以使用 SQL UPDATE 和 DELETE 命令更改和 刪除數據庫信息。 用 SQL UPDATE 命令,您可以改變數據庫表中各項目值。下面的腳本使用 UPDATE 命令將 Customers 表中每個 LastName 字段包含姓 Smith 記錄的 FirstName 字段更改為 Jeff。 <% Set cn = Server.CreateObject(\"ADODB.Connection\") cn.Open \"FILEDSN=MyDatabase.dsn\" cn.Execute \"UPDATE Customers SET FirstName = \'Jeff\' WHERE LastName = \'Smith\' \" %> 要想從數據庫表中刪除特定的記錄,可使用 SQL DELETE 命令。下面的腳本從 Customers 表中刪除了所有姓 Smith 的行: <% Set cn = Server.CreateObject(\"ADODB.Connection\") cn.Open \"FILEDSN=MyDatabase.dsn\" cn.Execute \"DELETE FROM Customers WHERE LastName = \'Smith\'\" %> 注意 在使用 SQL DELETE 命令時,必須謹慎從事。當使用不帶 WHERE 子句的 DELETE 命令時,它將刪除表中的所有行。一定要包含 SQL WHERE 子句來指定要 刪除的確切行。 使用 Recordset 對像處理結果 儘管 Connection 對像簡化了連接數據庫和查詢任務,但 Connection 對像仍有 許多不足。確切地說,檢索和顯示數據庫信息的 Connection 對像不能用於創建 腳本;您必須確切知道要對數據庫作出的更改,然後才能使用查詢實現更改。 對於檢索數據、檢查結果、更改數據庫,ADO 提供了 Recordset 對象。正如它 的名稱所暗示的那樣,Recordset 對像有許多您可以使用的特性,根據您的查詢 限制,檢索並且顯示一組數據庫行,即記錄。 Recordset 對像保持查詢返回的 記錄的位置,允許您一次一項逐步掃描結果。 根據 Recordset 對像的指針類型屬性設置,您可以滾動和更新記錄。數據庫指 針可以讓您在一組記錄中定位到特定的項。指針還用於檢索和檢查記錄,然後在 這些記錄的基礎上執行操作。Recordset 對像有一些屬性,可用於精確地控制指 針的行為,提高您檢查和更新結果的能力。例如,您可以使用 CursorType 和 CursorLocation 屬性設置指針的類型,將結果返回給客戶端應用程序(結果通 常保留在數據庫服務器上)並顯示其他用戶對數據庫的最後一次更改。有關配置 Recordset 對像指針的信息,請參閱 Microsoft ActiveX Data Objects (ADO)。 檢索記錄 一個成功的數據庫應用程序都使用 Connection 對像建立鍊接並使用 Recordset 對像處理返回的數據。通過「協調」兩個對像的特定功能,您可以開 發出幾乎可以執行任何數據處理任務的數據庫應用程序。例如,下面的服務器端 腳本使用 Recordset 對像執行 SQL SELECT 命令。SELECT 命令檢索一組基於查 詢限制的信息。查詢也包含 SQL WHERE 子句,用來縮小查詢的範圍。此例中, WHERE 子句將查詢限制為所有的 Customers 數據庫表中包含的姓 Smith 的記 錄。 <% \'Establish a connection with data source strDSN = \"FILEDSN=MyDatabase.dsn\" Set cn = Server.CreateObject(\"ADODB.Connection\") cn.Open strDSN \'Instantiate a Recordset object Set rsCustomers = Server.CreateObject(\"ADODB.Recordset\") \'Open a recordset using the Open method \' and use the connection established by the Connection object strSQL = \"SELECT FirstName, LastName FROM Customers WHERE LastName = \'Smith\' \" rsCustomers.Open strSQL, cn Cycle through record set and display the results \' and increment record position with MoveNext method Set objFirstName = rsCustomers(\"FirstName\") Set objLastName = rsCustomers(\"LastName\") Do Until rsCustomers.EOF Response.Write objFirstName & \" \" & objLastName & \"
    \" rsCustomers.MoveNext Loop %> 注意,在前面的例子中,用來建立數據庫連接的 Connection 對像和 Recordset 對像使用該連接從數據庫中檢索結果。當您需要精確地設置和數據庫建立鍊接所 采用的方式時,這個方法是非常有用的。例如,如果您需要在連接嘗試失敗之前 指定等待的時間,則需要使用 Connection 對像去設置屬性。但是,如果您僅僅 想使用 ADO 默認的連接屬性建立連接,則應該使用 Recordset 對像的 Open 方 法去建立鍊接: <% strDSN = \"FILEDSN=MyDatabase.dsn\" strSQL = \"SELECT FirstName, LastName FROM Customers WHERE LastName = \'Smith\' \" Set rsCustomers = Server.CreateObject(\"ADODB.Recordset\") \'Open a connection using the Open method \'and use the connection established by the Connection object rsCustomers.Open strSQL, strDSN \'Cycle through the record set, display the results, \' and increment record position with MoveNext method Set objFirstName = rsCustomers(\"FirstName\") Set objLastName = rsCustomers(\"LastName\") Do Until rsCustomers.EOF Response.Write objFirstName & \" \" & objLastName & \"
    \" rsCustomers.MoveNext Loop %> 當使用 Recordset 對像的 Open 方法建立一個連接時,必須使用 Connection 對像去保證鍊接的安全。詳細信息,請參閱 Microsoft ActiveX Data Objects (ADO)。 用 Command 對像改善查詢 通過 ADO Command 對象,可以象用 Connection 對像和 Recordset 對像那樣執 行查詢,唯一的不同在於用 Command 對像您可以在數據庫源上準備、編譯您的 查詢並且反覆使用一組不同的值來發出查詢。這種方式的編譯查詢的優點是您可 以最大程度地減少向現有查詢重複發出修改的請求所需的時間。另外,您還可以 在執行之前通過您的查詢的可變部分的選項使 SQL 查詢保持局部未定義。 Command 對像的 parameter 集合減少了您的麻煩,使您不必在每次重新發出查 詢時重新建立查詢。例如,如果需要有規律地更新基於庫存清單的 Web 系統中 的供應和價格信息,可以用下面的方法預先定義查詢: <% \'Open a connection using Connection object Command object \'does not have an Open method for establishing a connection strDSN = \"FILEDSN=MyDatabase.dsn\" Set cn = Server.CreateObject(\"ADODB.Connection\") cn.Open strDSN \'Instantiate Command object; use ActiveConnection property to attach \'connection to Command object Set cm= Server.CreateObject(\"ADODB.Command\") Set cm.ActiveConnection = cn \'Define SQL query cm.CommandText = \"INSERT INTO Inventory (Material, Quantity) VALUES (?, ?)\" \'Save a prepared (or pre-compiled) version of the query specified in CommandText \'property before a Command object\'s first execution. cm.Prepared = True \'Define query parameter configuration information cm.Parameters.Append cm.CreateParameter(\"material_type\",200, ,255 ) cm.Parameters.Append cm.CreateParameter(\"quantity\",200, ,255 ) \'Define and execute first insert cm(\"material_type\") = \"light bulbs\" cm(\"quantity\") = \"40\" cm.Execute \'Define and execute second insert cm(\"material_type\") = \"fuses\" cm(\"quantity\") = \"600\" cm.Execute %> 請檢查上面的例子,您將注意到,腳本用不同的數值重複構建和發出一個 SQL 查 詢,而沒有重新定義和重發送查詢到數據庫源。用 Command 對像編譯查詢也可 避免 SQL 查詢引起的合並字符串和表格變量問題。特別是,通過使用 Command 對像的 Parameter 集合可以避免與定義字符串、日期、時間變量的類型有關的 問題。例如,包含\"\'\"的 SQL 查詢值可能導致查詢失敗: strSQL = \"INSERT INTO Customers (FirstName, LastName) VALUES (\'Robert\',\'O\'Hara\')\" 注意,姓 O\'Hara 中包含一個\"\'\",它與在 SQL VALUES 關鍵字中用來表示數 據的「\'\"沖突。通過將查詢數值作為 Command 對像參數綁定,可以避免此類問 題。 結合 HTML 表格和數據庫訪問 包含 HTML 表格的 Web 頁可使用戶遠程查詢數據庫並且檢索特定的信息。用 ADO 您可以創建非常簡單的腳本來收集用戶表格信息、創建自定義的數據庫查詢 以及將信息返回給用戶。使用 ASP Request 對象,您可以檢索輸入到 HTML 表 格的信息並將這些信息合並到 SQL 語句中。例如,下面的腳本模塊將 HTML 表 格提供的信息插入表格中。此腳本用 Request 對像的 Form 集合收集用戶信息。 <% \'Open a connection using Connection object. The Command object \'does not have an Open method for establishing a connection strDSN = \"FILEDSN=MyDatabase.dsn\" Set cn = Server.CreateObject(\"ADODB.Connection\") cn.Open strDSN \'Instantiate Command object \'and use ActiveConnection property to attach \'connection to Command object Set cm= Server.CreateObject(\"ADODB.Command\") Set cm.ActiveConnection = cn \'Define SQL query cm.CommandText = \"INSERT INTO MySeedsTable (Type) VALUES (?)\" \'Define query parameter configuration information cm.Parameters.Append cm.CreateParameter(\"type\",200, ,255 ) \'Define and execute insert cm(\"type\") = Request(\"SeedType\") cm.Execute %> 有關表格和使用 ASP Request 對像的詳細信息,請參閱 使用 HTML 表格。 管理數據庫連接 設計一個能經得起考驗的 Web 數據庫應用程序(例如為幾千個客戶服務的聯機 購物應用程序)的最大挑戰,在於如何合理地管理數據庫連接。打開並且保持數 據庫連接,即使在沒有信息傳輸時,也會嚴重耗費數據庫服務器的資源並且可能 會導致連接性問題。設計良好的 Web 數據庫應用程序將回收數據庫連接並能夠 補償由於網絡堵塞造成的延遲。 使連接超時 活動的突然增長可能使數據庫服務器變得十分笨拙,大量增加建立數據庫連接的 時間。結果是,過長的連接延時將降低數據庫的性能。 用 Connection 對像的 ConnectionTimeout,您可以限制放棄連接嘗試並發出錯 誤消息之前應用程序等待的時間。例如,下面的腳本設置 ConnectionTimeout 屬 性,在取消連接嘗試之前等待 20 秒: Set cn = Server.CreateObject(\"ADODB.Connection\") cn.ConnectionTimeout = 20 cn.Open \"FILEDSN=MyDatabase.dsn\" 默認的 ConnectionTimeout 屬性是 30 秒。 注意 在將 ConnectionTimeout 屬性合並到數據庫應用程序之前,一定要確保連 接提供程序和數據源支持該屬性。 共享連接 經常建立和中斷數據庫連接的 Web 數據庫應用程序可能會降低數據庫服務器的 性能。ASP 支持用 ODBC 3.5 的共享特性有效管理連接。連接共享維持打開的數 據庫連接並管理不同的用戶共享該連接,以維持其性能和減少空閒的連接數。對 每一個連接請求,連接池首先確定池中是否存在空閒的連接。如果存在,連接池 返回連接而不是建立到數據庫的新連接。 如果希望將 ODBC 驅動程序加入到連接共享中,則必須配置數據庫驅動程序並在 Windows NT 註冊表中設置驅動程序的 CPTimeout 屬性。當 ODBC 斷開連接時, 連接被存入池中,而不是被斷開。CPTimeout 屬性決定在連接池中的連接保留的 時間長度。如果在池中連接保留的時間比 CPTimeout 設置的時間長,則連接將 被關閉並且從池中刪除。CPTimeout 的默認值是 60 秒。 您可以通過創建如下設置的註冊表鍵來有選擇地設置 CPTimeout 的屬性,從而 啟用特定 ODBC 數據庫驅動程序的連接池: \\HKEY_LOCAL_MACHINE\\SOFTWARE\\ODBC\\ODBCINST.INI\\driver-name\\CPTimeout = timeout (REG_SZ, units are in seconds) 例如,下面的鍵將 SQL Server 驅動程序的連接池的超時設置定為 180 秒(3 分 鐘)。 \\HKEY_LOCAL_MACHINE\\SOFTWARE\\ODBC\\ODBCINST.INI\\SQL Server\\CPTimeout = 180 注意 默認情況下,通過將 CPTimeout 設置為 60 秒,Web 服務器將激活 SQL Server 的連接池。 使用跨頁連接 儘管您可以通過存儲 ASP 的 Application 對像的連接重複使用跨頁連接,但 是,始終使連接保持打開是不必要的,也沒有充分利用連接池的優點。如果有許 多用戶需要連接到同一個 ASP 數據庫應用程序,一個好方法就是,將跨頁連接 字符串置於 ASP 的 Application 對像中,重複使用數據庫連接。例如,可以在 Global.asa 文件的 Application_OnStart 事件過程中指定連接字符串,如下面 的腳本所示: Application.lock Application(\"ConnectionString\") = \"FILEDSN=MyDatabase.dsn\" Application.unlock 然後,在每一個訪問數據庫的 ASP 文件中寫入: 要想創建連接對像的實例,請使用以下腳本: cn.Open Application(\"ConnectionString\") 對於打開的連接,可以在頁尾寫入以下腳本,關閉連接: cn.Close 在單個用戶需要重複使用跨頁連接的情況下,使用 Session 對像連接比使用 Application 對像更好。 關閉連接 要想更好地使用連接池,就應盡快地關閉數據庫連接。默認情況下,當腳本執行 完以後,連接將被終止。當不再需要連接時將其關閉,就可以減少對數據庫服務 器的要求並可以使其他用戶能夠使用該連接。 可以使用 Connection 對像的 Close 方法終止 Connection 對像和數據庫之間 的連接。下面的腳本打開連接,然後將其關閉: <% strDSN = \"FILEDSN=MyDatabase.dsn\" Set cn = Server.CreateObject(\"ADODB.Connection\") cn.Open cn.Close  熾天使書城

    【十一、調試ASP腳本】 無論您的計劃多麼精密、經驗多麼豐富,腳本錯誤(bug)可能在最初就 使您的 ASP 服務器端的腳本無法正確運行。也就是說調試,即查找和糾正腳本 錯誤,對開發一個成功的和強健的 ASP 程序是非常重要的。   Microsoft 腳本調試工具 Microsoft? Script Debugger 是一個功能強大的調試工具,它能幫助您迅速查 找錯誤並對服務器端的腳本進行交互測試。Script Debugger 與 Windows Internet Explorer 3.0 版本或更新的版本一起工作。通過它,您可以: 逐行運行服務器端腳本。 在服務器端腳本執行時,打開命令窗口監視變量、屬性或數組元素的值。 在特定行設置暫停標記,掛起服務器端腳本(使用調試工具或腳本命令)。 在運行服務器端腳本時跟蹤過程。 注意您可以使用調試工具查看腳本並找到錯誤所在,但是不能直接編輯腳本。要 想改正錯誤,必須用編輯器編輯腳本然後保存,再運行腳本。 詳細信息,請參閱 Microsoft 腳本調試程序. (該功能不能用於 Windows 95 或更高的版本。) 啟用調試 在開始調試服務器端腳本之前,您必須首先配置 Web 服務器,使其支持 ASP 調 試。有關配置命令及信息,請參閱 啟用 ASP 調試。 在啟用 Web 服務器調試之後,就可以使用下面的任一方法調試腳本: 手工打開 Microsoft 腳本調試器,調試 ASP 服務器端腳本。 使用 Internet Explorer 請求 .asp 文件。如果該文件包含錯誤或人為添加的 停止執行語句,那麼 Microsoft 腳本調試程序將自動啟動,顯示該腳本,並且 指出錯誤來源。 腳本錯誤 調試服務器端腳本時,您可能會碰到各種類型的錯誤。其中的某些錯誤使腳本無 法正確執行、程序停止執行或返回錯誤結果。 語法錯誤 語法錯誤是經常碰到的錯誤,它是由不正確的腳本語法導致的。例如,命令拼寫 錯誤或傳遞給函數的參數不正確都將產生錯誤。語法錯誤可能導致您的腳本不能 運行。 運行時錯誤 運行時錯誤是腳本在執行過程中腳本指令試圖執行不可能的動作而導致的。例 如,下面的腳本中包含一個被零除(一種非法的數學運算)的函數,將產生運行 時錯誤: 必須糾正導致運行時錯誤的錯誤,這樣才能使腳本在運行時不被中斷。 邏輯錯誤 邏輯錯誤通常可能是潛在和難以檢測的。如果有因鍵入錯誤或程序邏輯流程錯誤 引起的邏輯錯誤,腳本可能會成功運行,但產生的結果卻是錯的。例如,一服務 器端腳本計劃對一個值列表排序,如果本應使用 「<」 符號比較數值,但卻使 用了\" >」 符號,那麼將返回不正確的排序結果。 錯誤調試技術 可以使用多種不同的調試技術來查找錯誤的根源並測試應用程序。 實時 (Just-In-Time, JIT) 調試 當一個運行時錯誤中斷了 ASP 腳本的執行時,Microsoft 腳本調試程序自動啟 動,顯示 .asp 文件,將語句指針指向導致錯誤的行,並產生錯誤消息。這種調 試方式稱為實時 (JIT) 調試,計算機將暫停程序的執行。必須用編輯程序糾正 這些錯誤,保存所做的修正,然後再運行腳本。 斷點調試 當一個錯誤發生並且很難找到錯誤的根源時,可使用預設斷點的調試方法。斷點 將腳本暫停在特定一行。可以在腳本中有疑問處設置一個或多個不同的斷點,然 後使用調試器去改正腳本中設置的變量或屬性的值。當您糾正這些錯誤之後,可 以清除斷點以便您的腳本能不間斷地運行。 請用 Microsoft 腳本調試程序打開腳本,設置斷點。然後用 Web 瀏覽器請求此 腳本。當執行到腳本中含有斷點的行時,計算機啟動腳本調試程序,並且語句指 針會指在設置了斷點的行上。 VBScript Stop 語句調試器 通過在服務器端腳本中有問題的部分前面插入 Stop 語句,您也可以將斷點添加 到用 VBScript 編寫的服務器端腳本中。例如,下面的 ASP 腳本包含一個 Stop 語句,用來在顯示結果之前暫停執行: <% dayvalue = 3 TheDay = WeekDayName(dayvalue) Stop \'set breakpoint here. Response.Write(\"Today is \" + TheDay) %> 當您在請求 Web 瀏覽器使用的先前的腳本時,調試程序啟動並自動顯示 .asp 文件,而且語句指針會指示 stop 語句的位置。一定要記住從交付使用的 .asp 文件中刪除 Stop 語句。 用 JScript Debugger 語句調試 要將斷點加到用 Microsoft? JScript 編寫的服務器端腳本中,可在有疑問的行 前插入 debugger 語句。例如,下面的腳本包含了 debugger 語句,每次腳本循 環到一個新值時,就會中斷執行並自動啟動 Microsoft 腳本調試程序。 <%@ Language=\"JScript\" %> <% for (var count = 1; count <= 10; count++) { var eventest = count%2; debugger //Sets breakpoint if (eventest == 0) { response.write(\"Even value is \" + count + \"
    \") } } %> 請記住從交付使用的 .asp 文件中刪除 debugger 語句。 注意 不要混淆 debugger 語句和 JScript break 語句。在程序執行期間,break 語句僅退出當前循環,並不激活 Microsoft 腳本調試器,也不暫停程序的執行。 腳本調試技巧 除腳本調試程序外,一套好的調試技巧也能減少花費在分析腳本錯誤根源上的大 量時間。儘管大部分錯誤是由顯而易見的根源導致的,但命令拼寫錯誤或丟失變 量、某種類型的邏輯和執行錯誤也可能因不太明顯的根源所致。詳細信息,請參 閱 Microsoft 腳本調試程序文檔的\"調試技巧\"部分。 --------------------------------------------------------------------- ----------- 管理會話 成功開發 Web 應用程序的難題之一是在一次用戶訪問,即會話期間,當用戶在 一個應用程序的頁與頁之間跳轉的同時,維護用戶信息。HTTP 是一種無狀態協 議,也就是說,Web 服務器將某頁的每次訪問都當作相互無關的訪問來處理;服 務器不保留前一次訪問的任何信息,即使訪問就發生在當前訪問的幾秒鐘之前。 正因為這種不記憶以前訪問的特性使得編寫聯機目錄之類的應用程序很困難,此 類應用程序可能需要跟蹤用戶在目錄的不同頁間跳轉的同時曾選擇過的目錄項。 ASP 提供了一個管理會話信息問題的獨特方案。使用 ASP Session 對像和由您 的服務器生成的特殊用戶 ID,您可以創建一個智能應用程序,該應用程序可以 識別每個來訪的用戶並收集應用程序跟蹤用戶的首選項或選擇內容所要用到的 信息。 ASP 通過 HTTP cookie 設置用戶 ID。HTTP cookie 是存儲在用戶瀏覽器上的小 文件。因此,如果您正在為不支持 cookie 的瀏覽器創建應用程序,或者您的客 戶將瀏覽器設置為不接受 cookie,請不要使用 ASP 的會話管理功能。 您也可以編寫在應用程序啟動或結束時運行的腳本。有關定義應用程序啟動事件 或應用程序結束事件的信息,請參閱 Global.asa 參考。 啟動和結束會話 會話可以通過三種方式啟動: 一個新用戶請求訪問一個 URL,該 URL 標識了某個應用程序中的 .asp 文件, 並且該應用程序的 Global.asa 文件包含 Session_OnStart 過程。 用戶在 Session 對像中存儲了一個值。 用戶請求了一個應用程序的 .asp 文件,並且該應用程序的 Global.asa 文件使 用 標簽創建帶有會話作用域的對象的實例。有關使用 標簽 創建帶有會話作用域的對象的實例的詳細信息,請參閱使用組件。 如果用戶在指定時間內沒有請求或刷新應用程序中的任何頁,會話將自動結束。 這段時間的默認值是 20 分鐘。可以通過在 Internet 服務管理器中設置\"應用 程序選項\"屬性頁中的\"會話超時\"屬性改變應用程序的默認超時限制設置。應 依據您的 Web 應用程序的要求和服務器的內存空間來設置此值。例如,如果您 希望瀏覽您的 Web 應用程序的用戶在每一頁僅停留幾分鐘,就應該縮短會話的 默認超時值。過長的會話超時值將導致打開的會話過多而耗盡您的服務器的內存 資源。 對於一個特定的會話,如果您想設置一個小於默認超時值的超時值,可以設置 Session 對像的 Timeout 屬性。例如,下面這段腳本將超時值設置為 5 分鐘。 <% Session.Timeout = 5 %> 您也可以設置一個大於默認設置的超時值,Session.Timeout 屬性決定超時值。 您也可以通過 Session 對像的 Abandon 方法顯式結束一個會話。例如,在表格 中提供一個「退出」按鈕,將按鈕的 ACTION 參數設置為包含下列命令的 .asp 文 件的 URL 。 <% Session.Abandon %> 關於 SessionID 和 Cookie 當用戶第一次請求給定的應用程序中的 .asp 文件時,ASP 生成一個 SessionID。 SessionID 是由一個複雜算法生成的號碼,它唯一標識每個用戶會 話。在新會話開始時,服務器將 Session ID 作為一個 cookie 存儲在用戶的 Web 瀏覽器中。 SessionID 與鑰匙很相似,當會話期間用戶與應用程序交互時,ASP 可以將用戶 信息存儲在服務器的一個「保險箱」中。正像用鑰匙能存取保險箱中物品一樣, 通過在 HTTP 請求標題中發送的用戶 SessionID cookie,就能夠對該\"保險 箱\"中的內容進行訪問。每當 ASP 收到一個頁請求時,就檢查 HTTP 請求標題, 以獲得 SessionID cookie。 在將 SessionID cookie 存儲於用戶的瀏覽器之後,即使用戶請求了另一 個 .asp 文件,或請求了運行在另一個應用程序中的 .asp 文件,ASP 仍會重用 該 cookie 跟蹤會話。與此相似,如果用戶故意放棄會話或讓會話超時,然後再 請求另一個 .asp 文件,那麼 ASP 將以同一個 cookie 開始新的會話。只有當 服務器管理員重新啟動服務器或用戶重新啟動 Web 瀏覽器時,此時存儲在內存 中的 SessionID 設置將被清除,用戶將會獲得新的 SessionID cookie。 通過重用 SessionID cookie,ASP 將發送給用戶瀏覽器的 cookie 數量降為最 低。另外,如果您決定您的 ASP 應用程序不需要會話管理,就可以不讓 ASP 跟 蹤會話和向用戶發送 SessionID 。 ASP 在以下情況下不發送會話的 cookie: 應用程序的會話狀態被禁用。 ASP 頁被定義為無會話,即該頁包含 <%@ EnableSessionState=False %> 標記。 詳細信息,請參閱 無會話的 ASP 頁。 請注意,SessionID cookie 並不提供跟蹤用戶對某個 Web 站點的多次訪問的永 久方法。存儲在服務器內存中的 SessionID 信息很容易丟失。如果想跟蹤在很 長時間內訪問您的 Web 應用程序的用戶,必須通過在用戶的 Web 瀏覽器中存儲 一個專門的 cookie,並將 cookie 信息保存到數據庫中來創建一個用戶標識。 詳細信息,請參閱 使用 Cookie。 在 Session 對像中存儲數據 Session 對像提供了一個可在其中存儲信息的動態關聯數組。您可以在 Session 對像中存儲數值變量和對像變量。 通過對 Session 對像中的命名項賦值,可將變量存儲在 Session 對像中。例如, 以下命令將兩個新變量存儲在 Session 對像中: <% Session(\"FirstName\") = \"Jeff\" Session(\"LastName\") = \"Smith\" %> 通過訪問該命名項可從 Session 對像中獲取信息。例如,顯示 Session(\"FirstName\") 的當前值: Welcome <%= Session(\"FirstName\") %> 可以在 Session 對像中存儲用戶的首選項,然後通過訪問首選項來決定將哪一 頁發送給用戶。例如,可以允許用戶在您的應用程序的第一頁中指定純文本版本 的內容並將這一選擇應用到用戶此後對該應用程序的所有頁的訪問上。 <% If Session(\"ScreenResolution\") = \"Low\" Then %> This is the text version of the page. <% Else %> This is the multimedia version of the page. <% End If %> 您也可以在 Session 對像中存儲一個對像實例,但這樣做會影響服務器的性能。 詳細信息,請參閱設置對像作用域。 管理 Web Farm 的會話 ASP 會話信息存儲在 Web 服務器中。瀏覽器必須向 Web 服務器請求頁才能獲得 用來訪問會話信息的腳本。在 Web Farm(其中許多 Web 服務器共同承擔響應用 戶申請的責任)中,用戶的請求並不總是被路由到同一個服務器,而是由一個被 稱為負載平衡進程的特殊軟件對此 URL 站點的申請分配任意一個空閒的服務 器。負載平衡進程使在 Web Farm 中保存會話信息變得更加困難。 為了在一個負載被平衡的站點上使用 ASP 會話管理,必須保證用戶會話的所有 請求都被定向到同一個 Web 服務器。一種做法是編寫一個 Session_OnStart 過 程,此過程使用 Response 對像將瀏覽器重定向到運行該用戶會話的 Web 服務 器。如果在您的應用程序頁中的所有鍊接都是相對的,那麼以後對某一頁的所有 請求都將被路由到同一個服務器。 例如,某用戶要通過請求某一站點的通用 URL:http://www.microsoft.com 來 訪問一個應用程序。負載平衡進程將申請路由到服務器 server3.microsoft.com。ASP 在此服務器上生成了一個新的用戶會話。在 Session_OnStart 過程中,瀏覽器被重定向給指定的服務器: <% Response.Redirect(\"http://server3.microsoft.com/webapps/firstpage.asp \") %> 瀏覽器將請求指定的頁,並且以後的所有請求都將被路由到同一個服務器。 使用 Cookie cookie 是 Web 服務器嵌在用戶的 Web 瀏覽器中,用來代表用戶的令牌。當下 次同一瀏覽器請求一頁時,它將發送從 Web 服務器收到的 cookie。 cookie 允 許有一組信息與用戶關聯。 ASP 腳本使用 Response 和 Request 對像的 Cookies 集合,可以獲取和設置 cookie 的值。 設置 cookie 要設置 cookie 的值,可使用 Response.Cookies。如果 cookie 不存在, Response.Cookies 將創建新的 cookie。例如,要向瀏覽器發送一個有關聯值 (\"Mars\") 的 cookie 名 (\"planet\"),可使用下列命令,這些命令必須出現在您 的 Web 頁的 標記前: <% Response.Cookies(\"planet\")=\"Mars\" %> 如果您只希望 cookie 在當前的用戶會話中被使用,則只需向瀏覽器發送 cookie。但是,如果要在用戶已經終止或重新啟動瀏覽器之後確認用戶,就必須 強制瀏覽器將 cookie 存儲在計算機的硬盤上。要保存 cookie,可使用 Response.Cookies 的 Expires 屬性並將日期設置為此後的某一天: <% Response.Cookies(\"planet\") = \"Mars\" Response.Cookies(\"planet\").Expires = \"January 1, 1999\" %> cookie 可有多個值;這樣的 cookie 被稱為一個 帶索引的 cookie。每個 cookie 值都被賦予一個關鍵字;您可以設置一個特定的 cookie 關鍵字的值。 例如: <% Response.Cookies(\"planet\")(\"Mars\")=\"SpaceMissions\" %> 如果某個現有的 cookie 具有關鍵字值但 Response.Cookies 未指明一個關鍵 字的名稱,則該關鍵字值將被刪除。類似的,如果某個現有的 cookie 沒有關鍵 字值但 Response.Cookies 指明了關鍵字的名稱和值,則現有的 cookie 值將被 刪除,並生成新的 key-value 對。 獲取 cookie 要獲取 cookie 的值,可使用 Request.Cookies 集合。例如,如果用戶的 HTTP 請求設置了 planet=Mars,則下列語句將獲取值 Mars: <%= Request.Cookies(\"planet\") %> 相似的,要從帶索引的 cookie 中獲取關鍵字值,可使用關鍵字名。例如,如果 用戶發出下列的 HTTP 請求: planet=Mars&Mars=SpaceMissions 下列腳本將返回值 SpaceMissions: <%= Request.Cookies(\"planet\")(\"Mars\") %> 設置 cookie 路徑 由 ASP 存儲在用戶的 Web 瀏覽器中的每個 cookie 都包含路徑信息。當瀏覽器 請求的文件的位置與在 cookie 中指定的路徑相同時,瀏覽器自動將 cookie 轉 發給服務器。默認情況下,cookie 路徑與包含最初生成 cookie 的 .asp 文件 的應用程序名對應。例如,如果在名為 UserApplication 的應用程序中的 .asp 文件生成了一個 cookie,那麼每當用戶的 Web 瀏覽器在此應用程序中獲取文件 時,除其他在路徑 /UserApplication 下的 cookie 外,瀏覽器還要將該 cookie 轉發給服務器。 要給 cookie 聲明一個不同於默認的應用程序路徑的路徑,可以使用 ASP 的 Response.Cookies 集合的 Path 屬性。例如,下列腳本將路徑 SalesApp/Customer/Profiles/ 賦予名為 Purchases 的 cookie: <% Response.Cookies(\"Purchases\") = \"12\" Response.Cookies(\"Purchases\").Expires = \"January 1, 2001\" Response.Cookies(\"Purchases\").Path = \"/SalesApp/Customer/Profiles/\" %> 每當包含 Purchases cookie 的 Web 瀏覽器請求位於路徑 /SalesApp/Customer/Profiles/ 或其子目錄的文件時,瀏覽器將 cookie 轉發 給服務器。 許多 Web 瀏覽器,包括 Microsoft Internet Explorer 4.0 和 Netscape 瀏覽 器,保留 cookie 路徑的大小寫。也就是說,如果一個被請求的文件的大小寫與 保留的 cookie 路徑不同,那麼瀏覽器是不會向服務器轉發 cookie 的。例如, 對於 ASP,虛擬目錄 /TRAVEL 和 /travel 是相同的 ASP 應用程序,而對於保 留 URL 的大小寫的瀏覽器而言,/TRAVEL 和 /travel 則是兩個不同的應用程 序。應確保 .asp 文件的所有 URL 具有相同的大小寫,以保證用戶的瀏覽器能 夠轉發存儲的 cookie。 如果需要,可使用下列語句設置 cookie 路徑,使得無論應用程序或路徑是什麼, 只要用戶的 Web 瀏覽器向您的服務器請求文件,就會轉發 cookie : Response.Cookies(\"Purchases\").Path = \"/\" 但是,請注意,在不區分應用程序的情況下向服務器發送 cookie,如果 cookie 包含不應被指定應用程序以外的程序訪問的敏感信息,就可能產生安全性問題。 不使用 cookie 而保留狀態 並不是所有的瀏覽器都支持 cookie。即便使用支持 cookie 的瀏覽器,有些用 戶也可能喜歡關閉 cookie 支持。如果您的應用程序需要響應不支持 cookie 的 瀏覽器,就必須使用 ASP 會話管理。 如果您不使用 ASP 會話管理,就必須編寫您自己的機制以便在您的應用程序頁 之間傳遞信息。有兩種常規的方法可完成該任務: 向 URL 的查詢字符串添加參數。例如: http://MyServer/MyApp/start.asp?name=Jeff 但是,某些瀏覽器,在表格被以 GET 方法提交的情況下會丟棄查詢字符串中傳 遞的顯式參數。 向表格中添加隱含值。例如,以下的 HTML 表格包含一個隱含的控件。此控件在 真正的表格中不出現,而且對用戶的 Web 瀏覽器是不可見的。通過 HTTP POST 方法,表格除了傳遞用戶提供的信息外,還傳遞用戶標識。
    本方法要求傳輸用戶信息的所有鍊接目標被編碼為 HTML 表格。 如果您當前沒有使用 ASP 會話管理,請關閉您的應用程序會話支持。當會話啟 用時,ASP 向每個請求 ASP 頁的瀏覽器發送 SessionID cookie。要關閉會話支 持,可清除 Internet 服務管理器中的「應用程序選項」屬性頁中的「啟用會話 狀態」復選框。 無會話的 ASP 頁 ASP 也提供創建無會話頁的功能,您可以使用該功能將會話的創建時間推遲到用 戶訪問一個需要會話跟蹤的 ASP 頁時。 無會話頁不執行以下功能: 執行 Session_OnStart 過程。 發送會話 ID cookie。 創建 Session 對象。 訪問用 標記創建的內建會話對像或會話作用域對象。 與其他會話請求順序執行。 要將 .asp 配置為無會話,可使用下列語句: <%@ EnableSessionState=False %> 您應將此腳本置於 .asp 文件的第一行,位於其他腳本之前。默認情況下,若省 略此標記,則啟用會話跟蹤。 無會話 ASP 頁通過消除潛在的耗時會話操作,改善服務器的響應性能。例如, 考慮以下情況,ASP 頁包含某個幀集中的兩個 HTML 幀,幀 1 和 幀 2。幀 1 包 含一個執行複雜腳本的 .asp 文件,而幀 2 包含一個簡單的 .html 文件。因為 ASP 順序執行(即串行執行)會話請求,所以在幀 1 的腳本被執行之前,您將 不會看到幀 2 的內容。但是,如果您將幀 1 設置為無會話,則 ASP 請求將不 再被串行處理,瀏覽器不必等待執行完幀 1 的內容就可以處理幀 2 的內容。 但是,不同幀的多個請求的處理方式最終還要取決於用戶 Web 瀏覽器的配置。 某些 Web 瀏覽器可能不理會您的 .asp 文件的無會話配置,照樣串行處理請求。 熾天使書城

    【十二、 維護 ASP 應用程序的安全】 千萬不要輕視正確配置安全設置的重要性。如果不正確配置安全設置, 不但會使您的 ASP 應用程序遭受不必要的篡改,而且會妨礙正當用戶訪問您 的 .asp 文件。 Web 服務器提供了各種方法來保護您的 ASP 應用程序免受未授權的訪問和篡 改。在您讀完本主題下的安全信息之後,請花一定的時間仔細檢查一下您的 Windows NT 和 Web 服務器安全性文檔。詳細信息,請參閱 安全性。 NTFS 權限 您可以通過為單獨的文件和目錄應用 NTFS 訪問權限來保護 ASP 應用程序文 件。NTFS 權限是 Web 服務器安全性的基礎,它定義了一個或一組用戶訪問文件 和目錄的不同級別。當擁有 Windows NT 有效帳號的用戶試圖訪問一個有權限限 制的文件時,計算機將檢查文件的訪問控製表 (ACL)。該表定義了不同用戶和用 戶組所被賦予的權限。如果用戶的帳號具有打開文件的權限,計算機則允許該用 戶訪問文件。例如,Web 服務器上的 Web 應用程序的所有者需要有「更改」權 限來查看、更改和刪除應用程序的 .asp 文件。但是,訪問該應用程序的公共用 戶應僅被授予「只讀」權限,以便將其限制為只能查看而不能更改應用程序的 Web 頁。 維護 Global.asa 的安全 為了充分保護 ASP 應用程序,一定要在應用程序的 Global.asa 文件上為適當 的用戶或用戶組設置 NTFS 文件權限。如果 Global.asa 包含向瀏覽器返回信息 的命令而您沒有保護 Global.asa 文件,則信息將被返回給瀏覽器,即便應用程 序的其他文件被保護。 有關配置 NTFS 權限的詳細信息,請參閱訪問控制。 注意一定要對應用程序的文件應用統一的 NTFS 權限。例如,如果您不小心過度 限制了一應用程序需要包含的文件的 NTFS 權限,則用戶可能無法查看或運行該 應用程序。為了防止此類問題,在為您的應用程序分配 NTFS 權限之前應仔細計 劃。 Web 服務器權限 您可以通過配置您的 Web 服務器的權限來限制所有用戶查看、運行和操作您的 ASP 頁的方式。不同於 NTFS 權限提供的控制特定用戶對應用程序文件和目錄的 訪問方式, Web 服務器權限應用於所有用戶,並且不區分用戶帳號的類型。 對於要運行您的 ASP 應用程序的用戶,在設置 Web 服務器權限時,必須遵循下 列原則: 對包含 .asp 文件的虛擬目錄允許\"讀\"或\"腳本\"權限。 對 .asp 文件和其他包含腳本的文件(如 .htm 文件等)所在的虛目錄允許「讀」 和「腳本」權限。 對包含 .asp 文件和其他需要\"執行\"權限才能運行的文件(如 .exe 和 .dll 文件等)的虛目錄允許「讀」和「執行」權限。 有關配置 Web 服務器權限的詳細信息,請參閱 訪問控制。 腳本映射文件 應用程序的腳本映射保證了 Web 服務器不會意外地下載 .asp 文件的源代碼。 例如,即使您為包含了某個 .asp 文件的目錄設置了\"讀\"權限,只要該 .asp 文件隸屬於某個腳本映射應用程序,那麼您的 Web 服務器就不會將該文件的源 代碼返回給用戶。 Cookie 安全性 ASP 使用 SessionID cookie 跟蹤應用程序訪問或會話期間特定的 Web 瀏覽器 的信息。這就是說,帶有相應的 cookie 的 HTTP 請求被認為是來自同一 Web 瀏 覽器。Web 服務器可以使用 SessionID cookies 配置帶有用戶特定會話信息的 ASP 應用程序。例如,如果您的應用程序是一個允許用戶選擇和購買 CD 唱盤的 聯機音樂商店,就可以用 SessionID 跟蹤用戶漫遊整個應用程序時的選擇。 SessionID 能否被黑客猜中? 為了防止計算機黑客猜中 SessionID cookie 並獲得對合法用戶的會話變量的 訪問,Web 服務器為每個 SessionID 指派一個隨機生成號碼。每當用戶的 Web 瀏覽器返回一個 SessionID cookie 時,服務器取出 SessionID 和被賦予的數 字,接著檢查是否與存儲在服務器上的生成號碼一致。若兩個號碼一致,將允許 用戶訪問會話變量。這一技術的有效性在於被賦予的數字的長度(64 位),此 長度使計算機黑客猜中 SessionID 從而竊取用戶的活動會話的可能性幾乎為 0。 加密重要的 SessionID Cookie 截獲了用戶 sessionID cookie 的計算機黑客可以使用此 cookie 假冒該用戶。 如果 ASP 應用程序包含私人信息,信用卡或銀行帳戶號碼,擁有竊取的 cookie 的計算機黑客就可以在應用程序中開始一個活動會話並獲取這些信息。您可以通 過對您的 Web 服務器和用戶的瀏覽器間的通訊鍊路加密來防止 SessionID cookie 被截獲。有關加密的詳細信息,請參閱 安全性。 使用身份驗證機制保護被限制的 ASP 內容 您可以要求每個試圖訪問被限制的 ASP 內容的用戶必須要有有效的 Windows NT 帳號的用戶名和密碼。每當用戶試圖訪問被限制的內容時,Web 服務器將進 行身份驗證,即確認用戶身份,以檢查用戶是否擁有有效的 Windows NT 帳號。 Web 服務器支持以下幾種身份驗證方式: 基本身份驗證提示用戶輸入用戶名和密碼。 Windows NT 請求/響應式身份驗證從用戶的 Web 瀏覽器通過加密方式獲取用戶 身份信息。 然而,Web 服務器僅當禁止匿名訪問或 Windows NT 文件系統的權限限制匿名訪 問時才驗證用戶身份。詳細信息,請參閱關於身份驗證。 保護元數據庫 訪問元數據庫的 ASP 腳本需要 Web 服務器所運行的計算機的管理員權限。在從 遠程計算機上運行這些腳本時,須經已通過身份驗證的連接,如使用 Windows NT 請求/響應驗證方式進行連接。應該為管理級 .asp 文件創建一個服務器或目錄 並將其目錄安全驗證方式設置為 Windows NT 請求/響應式身份驗證。目前,僅 Microsoft Internet Explorer version 2.0 或更高版本支持 Windows NT 請求 /響應式身份驗證。 使用 SSL 維護應用程序的安全 Secure Sockets Layer (SSL) 3.0 協議作為 Web 服務器安全特性,提供了一種 安全的虛擬透明方式來建立與用戶的加密通訊連接。SSL 保證了 Web 內容的驗 證,並能可靠地確認訪問被限制的 Web 站點的用戶的身份。 通過 SSL,您可以要求試圖訪問被限制的 ASP 應用程序的用戶與您的服務器建 立一個加密連接;以防用戶與應用程序間交換的重要信息被截取。詳細信息,請 參閱加密。 維護包含文件的安全 如果您從位於沒有保護的虛擬根目錄中的 .asp 文件中包含了位於啟用了 SSL 的目錄中的文件,則 SSL 將不被應用於被包含文件。因此,為了保證應用 SSL, 應確保包含及被包含的文件都位於啟用了 SSL 的目錄中。 客戶資格認證 控制對您的 ASP 應用程序訪問的一種十分安全的方法是要求用戶使用 客戶資 格登錄。客戶資格是包含用戶身份信息的數字身份證,它的作用與傳統的諸如護 照或駕駛執照等身份證明相同。用戶通常從委託的第三方組織獲得客戶資格,第 三方組織在發放資格證之前確認用戶的身份信息。(通常,這類組織要求姓名、 地址、電話號碼及所在組織名稱;此類信息的詳細程度隨給予的身份等級而異。) 每當用戶試圖登錄到需要資格驗證的應用程序時,用戶的 Web 瀏覽器會自動向 服務器發送用戶資格。如果 Web 服務器的 Secure Sockets Layer (SSL) 資格 映射特性配置正確,那麼服務器就可以在許可用戶對 ASP 應用程序訪問之前對 其身份進行確認。 用於處理資格證明的 ASP 腳本 作為 ASP 應用程序開發人員,您可以編寫腳本來檢查資格是否存在並讀取資格 字段。例如,您可以從資格證明中訪問用戶名字段和公司名字段。Active Server Pages 在 Request 對像的 ClientCertificate 集合中保存資格信息。詳細信 息,請參閱 ASP 內建對象。 必須將 Web 服務器配置為接受或需要客戶資格,然後才能通過 ASP 處理客戶資 格;否則,ClientCertificate 集合將為空。 --------------------------------------------------------------------- ----------- 創建事務性腳本 商業應用程序常常需要具有在事務內部運行腳本和組件的能力。事務是一種服務 器操作,即使該操作包括很多步驟(例如,定貨、查看存貨、付帳等),也只能 整體返回操作是成功還是失敗。用戶可以創建在事務內部運行的 ASP 腳本,如 果腳本的任何一部分失敗,整個事務都將會終止。 ASP 事務處理是以 Microsoft? Transaction Server (MTS) 為基礎的。 Microsoft? Transaction Server (MTS) 是一個事務處理系統,用於開發、配置 和管理高性能、可分級的、有魯棒性的企業 Internet 和 Intranet 服務器應用 程序。Transaction Server 為開發分佈式的,基於組件的應用程序提供了一個 應用程序設計模型。它也為配置和管理這些應用程序提供了一個運行環境。 創建事務性腳本的功能內置在 Internet Information Server 和 Personal Web Server 中。如果您安裝了 Microsoft Transaction Server,就可以將組件打包, 以使組件在事務內部運行。有關組件打包的詳細信息,請參閱創建 MTS 包。 關於事務 事務是整體成功或失敗的操作。事務處理用於對數據庫進行可靠地更新。在對數 據庫進行許多相關更改或同時更新多個數據庫時,要保證所有更改都被正確執 行。如果這些更改中的任何一個失敗,都需要恢複數據庫表的原始狀態。 如果沒有 MTS,您就需要編寫腳本和組件,手工跟蹤請求的更改情況,以便在某 些更改失敗時恢複數據。使用 MTS,您只需簡單的將您的腳本和組件聲明為\"需 要事務\"並讓 MTS 處理事務的一致性。事務處理只適用於數據庫訪問;MTS 不 能對文件系統或其他的非事務性資源的更改進行恢復操作。應用程序所訪問的數 據庫必須為 MTS 所支持。目前,MTS 支持 SQL Server 及任何支持 XA 協議(由 X/Open 協會制定)的服務器。MTS 將繼續擴展對其他數據庫的支持。 事務不能跨越多個 ASP 頁。如果一個事務需要來自多個組件的對象,則須將使 用這些對像的操作組合在一個 ASP 頁中。例如,假定有一個組件用於更新工資 單數據庫,還有一個組件用於更新人力資源數據庫中的員工記錄。為了記錄一個 員工的新的工資信息,您需要編寫這樣一個腳本,該腳本在一個事務環境中調用 這兩個組件,一個用於更新工資單數據庫,另一個用於更新人力資源數據庫中的 員工等級。 聲明事務性腳本 在將一個頁聲明為事務性時,此頁中的任何腳本命令和對像都運行在同一個事務 環境中。Transaction Server 處理生成事務的細節並決定事務成功(提交)或 失敗(終止)。要將某個頁聲明為事務性,可在頁首添加 @TRANSACTION 指令: <%@ TRANSACTION = value %> value 參數可以是下列之一: 值 意義 Requires_New 啟動一個新的事務。 Required 啟動一個新的事務。 Supported 不啟動事務。 Not_Supported 不啟動事務。 @TRANSACTION 指令必須在一頁中的第一行,否則將產生錯誤。必須將該指令添 加到需要在事務下運行的每一頁中。當腳本處理結束時,當前事務即告結束。 大多數應用程序只有一些特定的操作需要事務環境。例如,一個航空公司的站點 可能只需要事務性腳本處理購票和安排座位,而其他所有腳本則無須事務環境即 可安全運行。因為事務只須用於需要事務處理的頁即可,不要將應用程序的 Global.asa 文件聲明為事務性。 如果事務被終止,Transaction Server 將恢復對支持事務的資源的任何更改。 目前,僅數據庫服務器完全支持事務,因為數據庫中的數據對於企業應用是最為 關鍵的。Transaction Server 不對硬盤上的文件、會話和應用程序的變量、集 合等的改變進行恢復。然而您可以如下文主題所述,通過編寫事務事件來編寫恢 復變量和集合的腳本。在某些時候,您的腳本也可以顯式的提交或終止一個事務, 如向文件寫數據失敗時。 提交或終止腳本 因為 Transaction Server 跟蹤事務處理,所以它決定事務是完全成功還是失 敗。腳本可以通過調用 ObjectContext.SetAbort 顯式地聲明終止一個事務。例 如,當一個事務在從一個組件收到錯誤消息、違反商業規範時(例如,帳戶余額 小於 0)或讀寫文件等非事務性操作失敗時,腳本就需要終止該事務。如果頁在 事務完成之前超時,也必須終止事務。 編寫事務事件 腳本本身不能決定事務是成功還是失敗。但是,可以編寫提交或終止事務時被調 用的事件。例如,假設有一個確認銀行帳戶的腳本,並且您需要針對事務的不同 狀態將不同的頁返回給用戶,那麼就可以使用 OnTransactionCommit 和 OnTransactionAbort 事件來編寫對用戶的不同響應。 <%@ TRANSACTION = Required %> <% \'Buffer output so that different pages can be displayed. Response.Buffer = True %>

    Welcome to the online banking service

    <% Set BankAction = Server.CreateObject(\"MyExample.BankComponent\") BankAction.Deposit(Request(\"AcctNum\")) %>

    Thank you. Your transaction is being processed.

    <% \' Display this page if the transaction succeeds. Sub OnTransactionCommit() Response.Write \"\" Response.Write \"\" Response.Write \"Thank you. Your account has been credited.\" Response.Write \"\" Response.Write \"\" Response.Flush() end sub %> <% \' Display this page if the transaction fails. Sub OnTransactionAbort() Response.Clear() Response.Write \"\" Response.Write \"\" Response.Write \"We are unable to complete your transaction.\" Response.Write \"\" Response.Write \"\" Response.Flush() End sub %> 在 MTS 資源管理器中登記一個組件 為了參與一個事務,組件必須在 MTS 包中登記,而且必須被配置為需要事務。 例如,如果您的腳本是通過調用兩個組件來處理訂單的,一個更新庫存數據庫, 另一個更新付款數據庫。那麼,這兩個組件就要在同一個事務環境中運行。 Transaction Server 保證如果任意一個組件失敗,那麼將不會有數據庫被更新。 某些組件不需要事務;例如,Ad Rotator 組件。 註冊和配置事務性組件可使用 MTS 資源管理器。必須將事務的屬性設置為需要 事務或需要新事務。事務組件必須在 MTS 包中註冊。不要將組件放在 IIS 內部 進程包中,而應該創建自己的包。通常,應將所有的組件放在一個組件庫中。組 件庫的組件可被多個 ASP 應用程序使用並以 ASP 應用程序進程運行。使用 MTS 資源管理器可創建新的包並將包的 Activation 屬性設置為 Library。 也可以在 Server 包中註冊事務性組件。Server 包通常以服務器上的一個獨立 的進程運行。如果希望使用基於職能組的安全性檢查或希望您的組件可被遠程計 算機上的應用程序訪問,可對事務性組件使用 Server 包。 要使用 MTS 資源管理器,必須安裝 Microsoft Transaction Server。有關註冊 組件和選擇包類型的詳細信息,請參閱創建 MTS 包。 對像作用域 一般情況下,不要將從 MTS 組件中創建的對象存儲在 ASP Application 或 Session 對像中。 MTS 對像在事務完成後消失。因為 Session 對像和 Application 對像是為在不同 ASP 頁之間使用的對象實例設計的,所以不要用 它們保存在事務結束時即被釋放的對象。 ASP 腳本是已聲名的事務的根,即起始點。任何事務性 ASP 頁所使用的 MTS 對 象都被認為是事務的一部分。當事務完成後,在頁中使用的 MTS 對像將消失, 其中包括存儲在 Session 或 Application 對像中的對象。在此之後,從另一個 事務性頁中調用會話作用域或應用程序作用域對像的嘗試都將失敗。 事務排隊 從一個遠程服務器對數據庫的更新可能因為網絡延遲或故障而導致事務延遲或 終止。因為事務的所有部分都必須提交,所以應用程序將可能掛起,等待遠程服 務器的提交或終止消息,也可能由於無法發送數據庫更新而導致事務被放棄。 對於必須同時完成的更新,正確的做法是在事務的所有參與者都能夠提交之前, 終止事務或推遲完成事務。例如,航空公司的定票程序應該同時完成對客戶的銀 行帳號計入借方和對航空公司的銀行帳戶計入貸方。如果一個更新屬於事務整體 的一部分,但可能晚於其他更新,您可能不希望讓客戶等待整個更新過程的完成。 例如,機票預定事務可能也要向食品供應商發送食品訂單或更新客戶的旅程津 貼。這些操作雖然也必須完成,但可以晚一些。 Microsoft Message Queue Server 使您能夠將一個或一組更新捆綁到一個事務 性消息中送給遠程服務器。Message Queue Server 保證更新將被發送給遠程服 務器,即使目前網絡不可用。您的應用將收到一個提交消息,從而可以繼續處理 事務。 有關在 ASP 應用程序中使用消息隊列的示例,請參閱開發人員範例。要查看這 些示例,必須安裝 SDK 文檔。 有關 Microsoft Message Queue Server 的詳細信息,請參閱 Microsoft Message Queue Server。 --------------------------------------------------------------------- ----------- 模塊 1:創建 ASP 頁 請選擇本課的腳本語言 在本模塊中,通過創建自己的 ASP 頁(.asp 文件),您將學習一些 ASP 的基 本知識。在這些課程中用到的示例文件,可以在 localhost Web 服務器的 Tutorial 目錄 (C:\\WINNT\\Help\\iis\\htm\\tutorial) 中找到。請將您創建的文 件也保存到 Tutorial 目錄中。 要點要保存並查看您在本模塊中的工作結果,必須在 localhost Web 服務器上 對 /iishelp/iis/htm/tutorial 虛擬目錄具有\"寫 (Write)\"和\"改編 Web 服務器 (Script Web server)\"權限,當然必須已經安裝了 Active Server Pages。詳細信息,請參閱 設置 Web 服務器權限。 熾天使書城 踴躍購買他們的書籍,用實際行動來支持你欣賞的作者 作者->佚名 网上購買書籍

    熾天使書城收集整理