熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

在ASP中操作HTTP報頭方法分析

2013-11-13 10:43:20  來源: .NET編程 

  我們已經在幾處見到ASP如何創建或修改在響應頁面請示時被發送到客戶的HTTP報頭在Response對象中有幾個屬性和方法可幫助我們做到一點下面是一些報頭方法

  · 控制緩存和有效期

  · 創建狀態和定制的HTTP報頭

  · 指定MIME類型或內容類型

  · 添加PICS標簽

  接下來將簡要地研究每一個方面可在“Response Object”主頁(show_responseasp)上單擊相關屬性名或方法名來檢查我們所說的屬性和方法

   緩存和“到期”ASP網頁

  用戶的浏覽器以及他們和服務器這間的任一代理服務器都可以緩存HTML和用ASP創建的網頁當用戶隨後請求頁面時浏覽器就發送一個“最新修改”的請求到服務器(使用一個包含緩存版本的日期的HTTP_IF_MODIFIED_SINCE報頭)詢問網頁是否已被修改

  若沒有被修改服務器應用狀態碼和消息“ Not Modified”來響應浏覽器將使用緩存的內容而不會通過網絡下載一個副本若已經存在已修改的版本它就會與“ OK”狀態碼和消息一道被發送出去

  ) ResponseCacheContol屬性

  其他的一些因素也會影響這一處理過程然而任一被網頁使用的網絡路由內的代理服務器(一般位於客戶機端)能被通過設置ResponseCacheControl屬性為Private來放棄緩存網頁在ASP 中對ASP網頁這是缺省的不用設置但在網頁為個別訪問者特別定制時尤其有用這可以阻止別的在同一網絡上的用戶進入同一網頁當CacheControl的屬性值被設定為Public時允許服務器緩存網頁注意一些代理服務器可能表現得不盡相同或忽視或越過這個報頭

  在IE在代理服務器緩存可用時有可能得到一個虛假的“This page has expired”消息我們已提供了一個網頁(expiretest_formasp)可以通過自己的代理服務器在網絡上做試驗來檢查這一屬性的影響可以通過在“Response Object”主頁中單擊“Response CacheControl”鏈接來顯示這個網頁如下圖所示

  這一頁面提交到expiretest_resultasp網頁時能夠設置ResponseCacheControl屬性然後在網頁中插入值和腳本被執行的時間

<%
If RequestForm(“public”) = “on” Then ‘CacheControl check box was ticked
 ResponseCacheControl = “Public”
Else
 ResponseCacheControl = “Private”
End If
%>
<HTML>

CacheControl is: <B><% = ResponseCacheControl %></B><P>
Value in text box is: <B><% ResponseWrite RequestForm(“textbox”) %>
<%
ResponseWrite Right(“” & Hour(Now)) & “:” & Right(“” & Minute(Now)_
& ) & “:” & Right(“” & Second(Now))
%></B>
  通過單擊浏覽器上的“Back”和“Forward”能看到代碼是自動執行還是使用緩存的副本

  ) ResponseExpires和ResponseExpiresAbsolute屬性

  控制緩存的網頁存放時間的兩個屬性為Response對象的Expires和ExpriesAbsolute屬性ResponseExpires定義了風頁在從緩存區被丟棄前應保持有效的時間長度以創建以來的分鐘數形式表示ExpiresAbsolute屬性為到期時間設置了一個絕對的日期和時間

  我們提供一個命名為addheaders_formasp的例子網頁用於演示如何使用這些屬性在“Response Object”主頁中單擊對這兩種屬性的鏈接

  在得到的頁面中可加入自己定制的HTTP報頭並可設置一些影響響應的HTTP報頭的多種屬性在“提交查詢內容”按鈕上單擊時頁面show_headersasp在返回的數據流中添加所選的報頭然後顯示用來完成此操作的代碼顯示相應的執行時間可用來檢查頁面是被緩存還是被再次執行

  show_headersasp網頁中的代碼創建和添加HTTP報頭程序如下

<%
‘Write HTTP headers before any other output
If RequestForm(“expires”) = “on” Then _
 ResponseExpires = RequestForm(“expires_value”)
If RequestForm(“expiresabs”) = “on” Then _
 ResponseExpiresAbsolute = RequestForm(“expiresabs_value”)
If RequestForm(“lastmod”) = “on” Then _
 ResponseAddHeader “LASTMODIFIED” Cstr(RequestForm(“lastmod_value”))
If RequestForm(“pragma”) = “on” Then _
 ResponseAddHeader “PRAGMA” CStr(RequestForm(“pragma_value”))
If RequestForm(“refresh”) = “on” Then _
 ResponseAddHeader “REFRESH” CStr(RequestForm(“refresh_value”))
If RequestForm(“addheader”) = “on” And Len(RequestForm(“addheader_name”)) Then _
 ResponseAddHeader CStr(RequestForm(“addheader_name”)) _
  CStr(RequestForm(“addheader_value”))
If RequestForm(“status”) = “on” Then _
 ResponseStatus = RequestForm(“status_value”)
%>
<HTML>

Show code and execution time

  其余部分僅僅是顯示已被執行的代碼和執行時間讀者會注意到包含在網頁中的定制的報頭“PRAGMA”(至今我們還沒討論過)一些(先前的)代理服務器使用它作為網磁是否應被緩存的指示缺省是網頁被緩沖除非接受到HTTP報頭“PRAGMA=NOCACHE“

   創建狀態碼和定制的HTTP報頭

  可使用先前在實例網頁中所看到的Response對象的AddHeader方法來創建自己的狀態碼或自己喜歡的定制的報頭這一方法需要兩個參數HTTP報頭名稱或一個包含其值或分配給它的值的字符串作為一個例子下面的代碼在頁面中添加REFRESH報頭

ResponseAddHeader “REFRESH”;URL=newpath/newpageasp”
  這等同於客戶機端<META>元素

<META HTTPEQUIV=”REFRESH”;URL=newpath/newpageasp”>
  換句話說也可配合Status屬性使用AddHeader方法使浏覽器載入一個新的頁面

ResponseStatus = “ Object Moved”
ResponseAddheader “Location” “newpath/newpageasp”
  這等同於使用ResponseRedirect方法

  ResponseRedirect “newpath/newpageasp”

  ResponseStatus屬性可被用來發送一些所需要的狀態消息例如添加如下幾行

  ResponseStatus= “ Unauthorized”

  ResponseAddheader “WWWAuthenticate” “BASIC”

  強制浏覽器顯示一個用戶名/口令對話框然後使用BASIC驗證把它們發送回服務器(將在本系列後續部分看到驗證方法)

   MIME類型和內容類型

  當我們想向浏覽器發送一個動態創建的字符串而且它們自己提供給浏覽器時沒有直接指明內容類型而是提供表示是否是磁盤文件的擴展名時ResponseContentType是非常有用的除非特別指定所有ASP創建的網頁缺省都為“text/type”內容類型的標識符是MIME類型(MIME代表Multipurpose Internet Multimedia Extension或Multipupose Internet Mail Extension通常依據上下文來定)

  例如若發送到客戶的數據注解是通過從數據庫讀二進制值創建的圖片就需要在發送任何內容之前添加合適的CONTENTTYPE報頭

ResponseContentType = “image/jpeg”
  假如從一個數據庫創建一個XML文件使用MIEM類型“text/xml”並且如果正在創建一個文本文件可以在文件編輯器中顯示或作為一個磁盤文件在客戶上被存儲起來使用“text/text”

   添加PICS卷標

  RespnsePics屬性僅僅是添加一個PICS(Platform for Internet Content system)卷標到頁面上方式與通常用<META>標記所用的方式相同

QUOT = Chr()
StrPicsLabel = “(PICS” & QUOT & “”_
& QUOT & “ gen true comment “ & QUOT _
& “RSACi North America Server” & QUOT & “ for “ & QUOT _
& “
& “T:” & QUOT & “ r (n s v l ))”
ResponsePics(strPicsLabel)
  這段代碼添加了如下的PICS卷標

(PICS “” gen true comment “RSACi
North America Server” for “:
r (n s v l ))
  要得到關於PICS的更多的信息或了解更多的定義頁面內容的方式請檢索站點

  在Internet Service Manager中定義報頭

  在本系列文章的第一部分已經說明了如何在Internet Service Manage(MMC插件)應用程序中設置每個Web網站和IIS 目錄的屬性這就定義了使用此站點或目錄資源發送到客戶機的所有請求的HTTP報頭也就提供了使用每個網頁中的ASP腳本代碼設置這些屬性的替代方法

  在Web站點或目錄上右擊鼠標並選擇“Properties”在其對話框的“HTTP Headers”選項卡中可設置頁面內容有效期的相對時間或絕對日期定義定制的報頭創建PICS內容等級標簽也可以通過MIME類型映射來定義內容類型

  那麼可以看到已創建了自定義的REFRESH HTTP報頭應用於從此目錄載入的所有網頁即每一分鐘自動地重載(刷新)一次(對於顯示棒球比賽的最近比分是非常理想的但對服務器而言負擔太重了)

  要在“MIME Map”框中添加自定義的內容類型映射只需在“Properties”主對話框中單擊“File Types”按扭把它們添加到清單中即可

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

   使用客戶證書

  假如設立了一個安全的Web網站或部分內容具有安全機制的網站可安裝一個數字服務器證書通過允許訪問者使用證書中的加密的細節來驗證服務器每一次對該站點或目錄的頁面請求服務器都將發送證書的一個副本浏覽器可檢查這個副本以確定正在和誰交談
同樣也可設置服務器要求用戶在進入網站時提供一個有效的數字證書他們可從很多來源獲得此證書例如Verisign()或Thawte Consulting讀者將在第章看到這一處理過程的細節

  這些情況都使用了Request對象的ClientCertificate集合的值本章的實例代碼中已包含了一個顯示用戶如何使用些集合值的一些方法的頁面

  這一網頁被命名為showcertasp而且其所做的一切就是遍歷ClientCertificate集合顯示其包含的所有值可使用以前經常使用的簡單代碼來完成它唯一的不同之處就是建立一個HTML表以容納結果並將其截為每個字符一組

<TABEL CELLPADDING= CELLSPACING=
<%
For Each keyItem In RequestClientCertificate()
 StrItemValue = RequestClientCertificate(keyItem)
 If Len(strItemValue) > Then strItemValue = Left(strItemValue ) & “etc
 ResponseWrite “<TR><TD>” & keyItem & “ = “ & strItemValue & “</TD></TR>”
Next
%>
</TABLE>
  使用客戶證書重定向

  一旦要求所有訪問網站或部分網站的浏覽者給出的其客戶證書就可以使用其包含的信息來制作我們為此用戶創建的網頁例如可使用他們的證書的Organization條目來自動使他們重定向到該網站的指定部分使別的訪問者重定向到別的地方

If RequestClientCertificate(“SubjectO”) = “Wrox Press Inc” Then
 ResponseRedirect “/wrox_staff/defaultasp” ‘Wrox staff site
Else
 ResponseRedirect “/public/Defaultasp” ‘Normal public site
End If
  相應地可使用Country條目來使訪問者重定向到一個相應的網站

Select Case RequestClientCertificate(“SubjectC”)
 Case “UK”: ResponseRedirect “
 Case “DE”: ResponseRedirect “
 Case “FR”: ResponseRedirect “
 ‘ ect
 Case Else: ResponseRedirect “
End Select
   讀寫二進制數據

  有兩個方法提供了對從浏覽器發送到服務器的HTTP數據流和從服務器返回到浏覽器的數據流的二進制數據訪問RequestBinaryRead方法可得到指定要讀取的字節數的參數並返回變體類型的數組其中包含從請求的POST段中得到的字節(例如在ASP的Form集合中數據)下面的程序讀數據的頭個字節

varContent = RequestBinaryRead()
  假如使用了BinaryRead方法以後就不能訪問ASP的RequestForm集合同樣一旦我們采用任何方式引用了RequestForm集合就不能使用BinaryRead方法

  把二進制數據寫進ASP創建的響應流中也是可能的可采用BinaryWrite方法需要給其提供想寫到客戶的字節的變體類型數組

ResponseBinaryWrite(varContent)
  這些方法都很少使用除非從一個數據庫創建非HTML源才用到這些方法使用的一個實例就是從數據庫讀取組成圖像的字節並使用BinaryWrite方法把它發送到客戶

   創建定制的日志消息

  假如設置了服務器以WC Extended Log File Format格式將請求記錄到一個文本文件可使用ResponseAppendToLog方法在日志文件條目的結尾處添加一條消息字符串若想為特定的網頁存儲一些值或消息或在腳本中出現了特定的情況時這種方式是非常有用的

  例如通過的Intranet的“stationary order”應用程序可以記錄超過特定的條目數目的雇員的部門號碼


If intItemCount > Then
 ResponseAppendToLog “Large order from ‘” & strDept & department
End If

  設置擴展的日志

  要使用AppendToLog方法必須激活WC Extended Log File Format日志設置該設置方法是進入Properties對話框中的Web Site選項卡選中Enable Logging復選框選擇WC Extended Log File Format並單擊Properties按鈕如下圖所示

  在出現的Extended Logging Properties對話框中可選擇想包括進日志文件的條目確保選中URI Stem否則AppendToLog方法將失敗

  我們提供了一個試圖在日志文件中寫入一個條目的簡單實例頁面可從Request Object主頁(show_requestasp)中的AppendToLog方法鏈接處打開它這一頁面所做的全部工作就是創建一個包含當前日期和時間的簡單字符串然後執行AppendToLog方法

strToAppend = “Page executed on ” & Now
ResponseAppendToLog strToAppend
  小結

  本文已經開始了對ASP 的研究而且我們也看到了ASP 如何與Internet Informateion Server 共同工作以提供一個易用的高效的創建動態Web網頁和Web應用程序的方法當然仍有一些地方需要去研究本章僅僅是學習了ASP內置的兩個最基本的對象
這兩個最基本的對象是Request和Response對象允許我們訪問和使用作為客戶機/服務器會話一部分的值無論用戶何時從Web網站請求和載入一個網頁或資源這種會話就會進行意味著Request對象能夠提供對用戶請求的全部內容的訪問同時Response對象允許創建和修改服務器發回的響應

  這些對象能夠通過集合和屬性揭示會話的各個部分並提供了多個能用來檢索和修改各段的方法假如把它們當作分解用戶請求和使用相應的內容創建響應的工具這有助你理解究竟發生了什麼這也將有助於理解各種方法如何影響客戶服務器和正在創建的網頁

 


From:http://tw.wingwit.com/Article/program/net/201311/14371.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.