其他Request和Response技巧

來源:互聯網
上載者:User
request|response|技巧


     現在,來看一下幾個使用Request和Response對象的有用技巧,包括:
     · 串連、緩衝和頁面重新導向的管理。
     · HTTP前序、緩衝與“到期”頁面的操作。
     · 利用客戶認證。
     · 建立定製的記錄檔訊息。

     1. 串連、緩衝和頁面重新導向的管理
     ASP的一個很有用的特點就是使使用者能夠從一個ASP網頁轉向到另一個網頁(ASP或HTML),或另一個源檔案(例如一個ZIP檔案或文字檔)。這對使用者來說是透明的,實際上是瀏覽器做這個工作。當使用Response.Redirect方法來載入一個新的網頁時,實際上是發送回一個特殊的HTTP前序到客戶。此前序為:
     HTTP/1.1 302 Object Moved
     Location /newpath/newpage.asp
     瀏覽器讀到此前序資訊,並按Location值的指示載入頁面。這在功能上與在Web頁中使用用戶端HTML<META>標記相同,例如:
     <META HTTP-EQUIV=”REFRESH” CONTENT=”0;URL=/newpath/newpage.asp”>
     這帶來的一個問題是,伺服器與使用者之間的Proxy 伺服器可能會提供它自己的包含與新頁面的連結的訊息,而不是直接載入新頁面。而且瀏覽器根據廠商和版本可能做同樣的工作。這就去除了假定的透明,而且對使用者來說一直收到的是錯誤資訊,則對你的網站的訪問變得比較麻煩。
     在發送諸如文本或HTML等任何頁面內容後,我們就不能再使用Redirect方法。然而,一個看起來能夠限制“Proxy 伺服器影響”的方法是,先確定沒有輸出(包括HTTP前序)被發送到客戶。在ASP 2.0中,必須開啟緩衝,然後使用Clear方法來清空緩衝區:
Response.Buffer = True
‘Some condition to select the appropriate page:
If Request.ServerVariables(“SERVER_PORT”) = 1856 Then
StrNewPage = “/newpath/this_page.asp”
Else
StrNewPage = “/newpath/the_other_page.asp”
End If
Response.Clear
Response.Redirect strNewPage
     在ASP 3.0中,緩衝預設為開啟,所以第一行可被忽略,但它是無害的,而且能確保我們的網頁即使在ASP 2.0環境中也仍然能工作。
     與其使用這種類型的HTTP前序重新導向,不如使用ASP 3.0的一個新特性,它允許我們通過Server對象的Transfer方法轉換為執行另一個網頁,我們將在第4章進一步研究這個問題。
     1) ASP頁面緩衝區
     正如已看到過的,IIS 5.0中ASP 3.0頁面緩衝是預設開啟的,在早期的版本中是預設關閉的。微軟告訴我們緩衝在IIS 5.0中提供了更有效網頁傳送,這就是緩衝預設狀態被改變的原因。在大部分情況下,這對我們沒有影響。但是,假如有一個非常大的網頁,或一個用ASP或別的伺服器端代碼和組件花費一定時間建立的網頁,當其各部分完成時,我們能夠分批重新整理它們到客戶:
...
... Code to create first part of the page
...
Response.Flush
...
... Code to create next part of page
...
Response.Flush
...
     有時可能希望在頁面結束之前的某些點上停止代碼的執行,可以通過調用End方法去重新整理所有的當前內容到客戶並中止任何進一步的處理過程。
...
... Code to create first part of the page
If strUserName = “” Then Response.Clear
...
... Code to create a new version of this part of the page
...
     這裡有兩上示範緩衝和重新導向的執行個體網頁,可以從“Response Object”首頁面(sow_response.asp)下載它們。第一個Response.Redirect例子網頁命名為redirect.asp,它在緩衝的頁面中定入一些內容,清除緩衝區,並重新導向到另一個網頁:
For intLoop = 1 To 1000000
Response.Write “.”
Next
Response.Clear
Response.Redirect “show_redirect.asp”
Response.End
     目標頁show_response.asp,做同樣的工作,但重新導向則是回到“Response Object”首頁。因為這些網頁都在緩衝區內,而且所有的輸出在重新導向之前必須清除,故在瀏覽器中沒有可見的輸出。然而,可以通過觀察瀏覽器的狀態看到發生的每一次重新導向。如下圖所示:

     在“Response Object”首頁中,點擊“Response.Flush”連結將開啟第二個樣本網頁usebuffer.asp,它簡單地遍曆一個字串的每一個字元,以一定的延遲將它們重新整理到客戶,這雖是Web伺服器和ASP極低效率的使用方式,但它示範了緩衝的工作方式。

     下面是所要求的最小化的ASP代碼,注意我們分別把每個字元重新整理到瀏覽器,因為不這樣的話它將被存放在緩衝區中,直至網頁完成:
strText = “This text has been flushed to the browser using “ & _
“<B>Response.Flush</B>

For intChar =1 To Len(strText)
For intWrite = 1 To 100000
Next
Response.Write Mid(strText,intChar,1)
Response.Flush
Next

     2) Response.IsClientConnected屬性
     IsClientConnected屬性在ASP 2.0中已經存在了,但卻有些不可靠。在其返回一個準確的結果之前必鬚髮送一些輸出到客戶。這一問題在ASP 3.0中已被解決。現在這一屬性可被自由使用。
     IsClientConnected是觀察使用者是否仍連到伺服器和正在載入ASP建立的網頁的有用方式。如果使用者中斷連線或停止下載,我們就不用再浪費伺服器的資源建立網頁,因為緩衝區內容將被IIS丟棄。所以,對那些需要大量時間計算或資源使用較多的網頁來說,值得在每一階段都檢查瀏覽器是否已離線:
...
... Code to create first part of the page
...
If Response.IsClientConnected Then
Response.Flush
Else
Response.End
End If
...
... Code to create next part of page...
     1. 操作HTTP前序
     我們已經在幾處見到ASP如何建立或修改在響應頁面請示時被發送到客戶的HTTP前序。在Response對象中有幾個屬性和方法可協助我們做到一點。下面是一些前序方法:
     · 控制緩衝和有效期間。
     · 建立狀態和定製的HTTP前序。
     · 指定MIME類型或內容類型。
     · 添加PICS標籤。
     接下來將簡要地研究每一個方面。可在“Response Object”首頁(show_response.asp)上,單擊相關屬性名稱或方法名,來檢查我們所說的屬性和方法,如下圖所示:

     1. 緩衝和“到期”ASP網頁
     使用者的瀏覽器以及他們和伺服器這間的任一Proxy 伺服器,都可以緩衝HTML和用ASP建立的網頁。當使用者隨後請求頁面時,瀏覽器就發送一個“最新修改”的請求到伺服器(使用一個包含緩衝版本的日期的HTTP_IF_MODIFIED_SINCE前序),詢問網頁是否已被修改。
     若沒有被修改,伺服器應用狀態代碼和訊息“304 Not Modified”來響應,瀏覽器將使用緩衝的內容而不會通過網路下載一個副本。若已經存在已修改的版本,它就會與“200 OK”狀態代碼和訊息一道被發送出去。
     1) Response.CacheContol屬性
     其他的一些因素也會影響這一處理過程。然而,任一被網頁使用的網路路由內的Proxy 伺服器(一般位於客戶機端),能被通過設定Response.CacheControl屬性為Private來放棄緩衝網頁。在ASP 3.0中對ASP網頁這是預設的,不用設定。但在網頁為個別訪問者特別定製時尤其有用。這可以阻止別的在同一網路上的使用者進入同一網頁。當CacheControl的屬性值被設定為Public時,允許伺服器緩衝網頁。注意,一些Proxy 伺服器可能表現得不盡相同,或忽視或越過這個前序。
     在IE4中,在Proxy 伺服器緩衝可用時,有可能得到一個虛假的“This page has expired”訊息。我們已提供了一個網頁(expiretest_form.asp),可以通過自己的Proxy 伺服器在網路上做實驗,來檢查這一屬性的影響。可以通過在“Response Object”首頁中單擊“Response. CacheControl”連結來顯示這個網頁。如下圖所示:

     這一頁面提交到expiretest_result.asp網頁時,能夠設定Response.CacheControl屬性,然後在網頁中插入值和指令碼被執行的時間:
<%
If Request.Form(“public”) = “on” Then ‘Cache-Control check box was ticked
Response.CacheControl = “Public”
Else
Response.CacheControl = “Private”
End If
%>
<HTML>
...
Cache-Control is: <B><% = Response.CacheControl %></B><P>
Value in text box is: <B><% Response.Write Request.Form(“textbox”) %>
<%
Response.Write Right(“0” & Hour(Now),2) & “:” & Right(“0” & Minute(Now),_
& 2) & “:” & Right(“0” & Second(Now),2)
%></B>
     通過單擊瀏覽器上的“Back”和“Forward”,能看到代碼是自動執行還是使用緩衝的副本,如下圖所示。結果隨瀏覽器的不同而變化。

     2) Response.Expires和Response.ExpiresAbsolute屬性
     控制緩衝的網頁存放時間的兩個屬性為Response對象的Expires和ExpriesAbsolute屬性。Response.Expires定義了風頁在從緩衝區被丟棄前應保持有效時間長度,以建立以來的分鐘數形式表示。ExpiresAbsolute屬性為到期時間設定了一個絕對的日期和時間。
     我們提供一個命名為addheaders_form.asp的例子網頁,用於示範如何使用這些屬性。在“Response Object”首頁中單擊對這兩種屬性的連結,如下圖所示:

     在這一頁面中,可加入自己定製的HTTP前序,並可設定一些影響響應的HTTP前序的多種屬性。在“提交查詢內容”按鈕上單擊時,頁面show_headers.asp在返回的資料流中添加所選的前序,然後顯示用來完成此操作的代碼,顯示相應的執行時間,可用來檢查頁面是被緩衝還是被再次執行,如下圖所示:

show_headers.asp網頁中的代碼建立和添加HTTP前序,程式如下:
<%
‘Write HTTP headers before any other output
If Request.Form(“expires”) = “on” Then _
Response.Expires = Request.Form(“expires_value”)
If Request.Form(“expiresabs”) = “on” Then _
Response.ExpiresAbsolute = Request.Form(“expiresabs_value”)
If Request.Form(“lastmod”) = “on” Then _
Response.AddHeader “LAST-MODIFIED”, Cstr(Request.Form(“lastmod_value”))
If Request.Form(“pragma”) = “on” Then _
Response.AddHeader “PRAGMA”, CStr(Request.Form(“pragma_value”))
If Request.Form(“refresh”) = “on” Then _
Response.AddHeader “REFRESH”, CStr(Request.Form(“refresh_value”))
If Request.Form(“addheader”) = “on” And Len(Request.Form(“addheader_name”)) Then _
Response.AddHeader CStr(Request.Form(“addheader_name”)), _
CStr(Request.Form(“addheader_value”))
If Request.Form(“status”) = “on” Then _
Response.Status = Request.Form(“status_value”)
%>
<HTML>
...
... Show code and execution time
...
     其餘部分僅僅是顯示已被執行的代碼和執行時間。讀者會注意到包含在網頁中的定製的前序“PRAGMA”(至今我們還沒討論過)。一些(先前的)Proxy 伺服器使用它作為網磁是否應被緩衝的指示。預設是網頁被緩衝,除非接受到HTTP前序“PRAGMA=NO-CACHE“。
     2. 建立狀態代碼和定製的HTTP前序
     可使用先前在執行個體網頁中所看到的Response對象的AddHeader方法來建立自己的狀態代碼或自己喜歡的定製的前序。這一方法需要兩個參數:HTTP前序名稱或一個包含其值或分配給它的值的字串。作為一個例子,下面的代碼在頁面中添加REFRESH前序:
     Response.AddHeader “REFRESH”, ”60;URL=newpath/newpage.asp”
     這等同於客戶機端<META>元素:
     <META HTTP-EQUIV=”REFRESH”, “60;URL=newpath/newpage.asp”
     換句話說,也可配合Status屬性使用AddHeader方法使瀏覽器載入一個新的頁面:
     Response.Status = “302 Object Moved”
     Response.Addheader “Location”, “newpath/newpage.asp”
     這等同於使用Response.Redirect方法:
     Response.Redirect “newpath/newpage.asp”
     Response.Status屬性可被用來發送一些所需要的狀態訊息,例如添加如下幾行:
     Response.Status= “401 Unauthorized”
     Response.Addheader “WWW-Authenticate”, “BASIC”
     強制瀏覽器顯示一個使用者名稱/口令對話方塊,然後使用BASIC驗證把它們發送回伺服器(將在本書後續部分看到驗證方法)。
     3. MIME類型和內容類型
     當我們想向瀏覽器發送一個動態建立的字串,而且它們自己提供給瀏覽器時沒有直接指明內容類型,而是提供表示是否是磁碟檔案的副檔名時,Response.ContentType是非常有用的。除非特別指定,所有ASP建立的網頁預設都為“text/type”。內容類型的標識符是MIME類型(MIME代表Multi-purpose Internet Multimedia Extension或Multi-pupose Internet Mail Extension,通常依據上下文來定)。
     例如,若發送到客戶的資料註解是通過從資料庫讀二進位值建立的圖片,就需要在發送任何內容之前添加合適的CONTENT-TYPE前序:
     Response.ContentType = “image/jpeg”
     假如從一個資料庫建立一個XML檔案,使用MIEM類型“text/xml”;並且如果正在建立一個文字檔可以在檔案編輯器中顯示或作為一個磁碟檔案在客戶上被儲存起來,使用“text/text”。
     4. 添加PICS卷標
     Respnse.Pics屬性僅僅是添加一個PICS(Platform for Internet Content system)卷標到頁面上,方式與通常用<META>標記所用的方式相同:
QUOT = Chr(34)
StrPicsLabel = “(PICS-1.0” & QUOT & “http://www.rsac.org/ratingsv01.html”_
& QUOT & “ 1 gen true comment “ & QUOT _
& “RSACi North America Server” & QUOT & “ for “ & QUOT _
& “http://yoursite.com” & QUOT & “ on “ & QUOT _
& “1999.08.01T03:04-0500” & QUOT & “ r (n 0 s 0 v 2 l 3))”
Response.Pics(strPicsLabel)
     這段代碼添加了如下的PICS卷標:
(PICS-1.0 “http://www.rsac.org/ratingsv01.html” 1 gen true comment “RSACi
North America Server” for “http://yoursite.com” on “1999.08.01T03:04-0500”
r (n 0 s 0 v 2 l 3))
     要得到關於PICS的更多的資訊,或瞭解更多的定義頁面內容的方式,請檢索http://www.rsac.org/網站。
     在Internet Service Manager中定義前序
     在第1章,已經說明了如何在Internet Service Manage(MMC外掛程式)應用程式中設定每個Web網站和IIS 5.0目錄的屬性,這就定義了使用此網站或目錄資源發送到客戶機的所有請求的HTTP前序,也就提供了使用每個網頁中的ASP指令碼代碼設定這些屬性的替代方法。
在Web網站或目錄上右擊滑鼠並選擇“Properties”,在其對話方塊的“HTTP Headers”選項卡中,可設定頁面內容有效期間的相對時間或絕對日期,定義定製的前序,建立PICS內容等級標籤,也可以通過MIME類型映射來定義內容類型,如下圖所示:

     在上圖中,可以看到已建立了自訂的REFRESH HTTP前序,應用於從此目錄載入的所有網頁。即每一分鐘自動地重載(重新整理)一次(對於顯示棒球比賽的最近比分是非常理想的,但對伺服器而言負擔太重了)。Custom HTTP Headers欄的Edit對話方塊如下圖所示:

     要在“MIME Map”框中添加自訂的內容類型映射,只需在“Properties”主對話方塊中單擊“File Types”按扭把它們添加到清單中即可,如下圖所示:

     當使用HTTP前序開始實驗時,你很快會發現不是所有的瀏覽器表現都相同,許多瀏覽器以不同的方式響應不同的HTTP前序,使得可靠地建立一個普遍適用的原則有時極為困難。

     2. 使用客戶認證
     假如設立了一個安全的Web網站或部分內容具有安全機制的網站,可安裝一個數字伺服器憑證,通過允許訪問者使用認證中的加密的細節,來驗證伺服器。每一次對該網站或目錄的頁面請求,伺服器都將發送認證的一個副本,瀏覽器可檢查這個副本以確定正在和誰交談。
     同樣,也可設定伺服器,要求使用者在進入網站時提供一個有效數位憑證。他們可從很多來源獲得此認證,例如Verisign(http://www.verisign.com)或Thawte Consulting(http://www.thawte.com)。讀者將在第25章看到這一處理過程的細節。
     這些情況都使用了Request對象的ClientCertificate集合的值,本章的執行個體代碼中,已包含了一個顯示使用者如何使用些集合值的一些方法的頁面。
     這一網頁被命名為showcert.asp,而且其所做的一切就是遍曆ClientCertificate集合顯示其包含的所有值。可使用以前經常使用的簡單代碼來完成它,唯一的不同之處就是建立一個HTML表以容納結果,並將其截為每60個字元一組。
<TABEL CELLPADDING=0 CELLSPACING=0>
<%
For Each keyItem In Request.ClientCertificate()
StrItemValue = Request.ClientCertificate(keyItem)
If Len(strItemValue) > 90 Then strItemValue = Left(strItemValue, 60) & “..etc.”
Response.Write “<TR><TD>” & keyItem & “ = “ & strItemValue & “</TD></TR>”
Next
%>
</TABLE>
     運行結果如下圖所示:

     使用客戶認證重新導向
     一旦要求所有訪問網站或部分網站的瀏覽者給出的其客戶認證,就可以使用其包含的資訊來製作我們為此使用者建立的網頁。例如,可使用他們的認證的Organization條目來自動使他們重新導向到該網站的指定部分,使別的訪問者重新導向到別的地方:
If Request.ClientCertificate(“SubjectO”) = “Wrox Press Inc” Then
Response.Redirect “/wrox_staff/default.asp” ‘Wrox staff site
Else
Response.Redirect “/public/Default.asp” ‘Normal public site
End If
     相應地,可使用Country條目來使訪問者重新導向到一個相應的網站:
Select Case Request.ClientCertificate(“SubjectC”)
Case “UK”: Response.Redirect “http://uk_site.co.uk/”
Case “DE”: Response.Redirect “http://de_site.co.de/”
Case “FR”: Response.Redirect “http://fr_site.co.fr/”
‘... ect.
Case Else: Response.Redirect “http://us_site.com/”
End Select

     3. 讀寫位元據
     有兩個方法提供了對從瀏覽器發送到伺服器的HTTP資料流和從伺服器返回到瀏覽器的資料流的位元據訪問。Request.BinaryRead方法可得到指定要讀取的位元組數的參數,並返回變體類型的數組,其中包含從請求的POST段中得到的位元組(例如在ASP的Form集合中資料)。下面的程式讀資料的頭64個位元組:
varContent = Request.BinaryRead(64)
     假如使用了BinaryRead方法,以後就不能訪問ASP的Request.Form集合。同樣,一旦我們採用任何方式引用了Request.Form集合,就不能使用BinaryRead方法。
     把位元據寫進ASP建立的響應流中也是可能的,可採用BinaryWrite方法。需要給其提供想寫到客戶的位元組的變體類型數組:
Response.BinaryWrite(varContent)
     這些方法都很少使用,除非從一個資料庫建立非HTML源才用到這些方法。使用的一個執行個體就是從資料庫讀取組成映像的位元組,並使用BinaryWrite方法把它發送到客戶。

     4. 建立定製的日誌訊息
     假如設定了伺服器,以W3C Extended Log File Format格式將請求記錄到一個文字檔,可使用Response.AppendToLog方法在記錄檔條目的結尾處添加一條訊息字串。若想為特定的網頁儲存一些值或訊息,或在指令碼中出現了特定的情況時,這種方式是非常有用的。
     例如,通過的Intranet的“stationary order”應用程式,可以記錄超過特定的條目數目的僱員的部門號碼:
...
If intItemCount > 25 Then
Response.AppendToLog “Large order from ‘” & strDept & department.”
End If
...

     設定擴充的日誌
     要使用AppendToLog方法,必須啟用W3C Extended Log File Format日誌設定。該設定方法是,進入Properties對話方塊中的Web Site選項卡,選中Enable Logging複選框,選擇W3C Extended Log File Format並單擊Properties按鈕,如下圖所示:

     在出現的Extended Logging Properties對話方塊中,可選擇想包括進記錄檔的條目。確保選中URI Stem,否則AppendToLog方法將失敗,如下圖所示:

     我們提供了一個試圖在記錄檔中寫入一個條目的簡單一實例頁面,可從Request Object首頁(show_request.asp)中的AppendToLog方法連結處開啟它。這一頁面所做的全部工作就是建立一個包含當前日期和時間的簡單字串,然後執行AppendToLog方法:
strToAppend = “Page executed on ” & Now
Response.AppendToLog strToAppend
     結果如下圖所示:


     小結
     本章已經開始了對ASP 3.0的研究,而且我們也看到了ASP 3.0如何與Internet Informateion Server 5.0共同工作,以提供一個易用的、高效的建立動態Web網頁和Web應用程式的方法。當然,仍有一些地方需要去研究,本章僅僅是學習了ASP內建的兩個最基本的對象。
     這兩個最基本的對象是Request和Response對象,允許我們訪問和使用作為客戶機/伺服器會話一部分的值,無論使用者何時從Web網站請求和載入一個網頁或資源,這種會話就會進行,意味著Request對象能夠提供對使用者請求的全部內容的訪問,同時Response對象允許建立和修改伺服器發回的響應。
     這些對象能夠通過集合和屬性揭示會話的各個部分,並提供了多個能用來檢索和修改各段的方法。假如把它們當作分解使用者請求和使用相應的內容建立響應的工具,這有助你理解究竟發生了什麼。這也將有助於理解各種方法如何影響客戶、伺服器和正在建立的網頁。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。