馮 菁
(淮北職業(yè)技術(shù)學(xué)院 計算機(jī)科學(xué)與技術(shù)系,安徽 淮北 235000)
ashx一般處理程序,可用它來處理Ajax請求,通過繼承HttpHandler類(或是實現(xiàn)IHttpHandler接口),從而免去了普通aspx頁面控件解析以及頁面處理的過程。[1]NET Framework在默認(rèn)情況下,把a(bǔ)spx WEB頁面的Request請求交給HttpHandlerFactory來處理的,當(dāng)頁面的一個HTTP請求到達(dá)時,HttpHandlerFactory會提供出一個HttpHandler容器,HTTP請求最終交給HttpHandler容器中的ProcessRequest方法來處理的。Ajax是Asynchronous JavaScript and XML的縮寫,即異步JavaScript和XML技術(shù)。[2]通過該技術(shù)的使用,實現(xiàn)了頁面的局部刷新,減小了網(wǎng)絡(luò)流量,改善用戶體驗,提升了系統(tǒng)的運行速度。在ASP.NET中結(jié)合使用JQuery+ashx一般處理程序,實現(xiàn)Ajax技術(shù)。
ASP.NET Ajax使得Ajax程序設(shè)計變得簡單,使用ASP.NET中的Ajax可快速創(chuàng)建包含具有快速響應(yīng)能力且熟悉的用戶界面元素的網(wǎng)頁,豐富了用戶的體驗。[2]ASP.NET Ajax中的JavaScript是跨平臺的,支持多個瀏覽器,不會因PostBack而讓整個頁面重新加載造成閃動,可以實現(xiàn)Web頁面局部更新,異步取回服務(wù)器端的數(shù)據(jù),用戶無需等待也不被打斷,提升頁面響應(yīng)能力。
ASP.NET Ajax主要有四個部分,Ajax服務(wù)器端控件、Ajax服務(wù)器端擴(kuò)展控件、Ajax服務(wù)器端遠(yuǎn)程Web Service橋、Ajax客戶端代理。[3]ASP.NET從4.0版開始,完全集成了Ajax框架,在Visual Studio 2010及以上版本中工具箱里就可以找到Ajax控件.ASP.NET Ajax客戶端架構(gòu)主要有API、API函數(shù)、基礎(chǔ)類庫、封裝的XMLHttpRequest對象、Ajax XML引擎、ASP.NET Ajax客戶端控件等。[3]
在Ajax應(yīng)用中,Ajax引擎相當(dāng)于中間通訊層,Web頁面HTTP請求通過Ajax引擎與服務(wù)器端進(jìn)行通信,響應(yīng)返回的結(jié)果提交給Ajax引擎,再由Ajax引擎來決定將這些數(shù)據(jù)顯示到頁面的指定位置.在Ajax中,變成對Ajax引擎的一次調(diào)用.只對部分頁面進(jìn)行更新。[3]
Ajax Web頁面的工作過程如圖1所示:
圖1 Ajax工作過程
一般處理程序HttpHandler是一種.NET WEB組件,擴(kuò)展名為.ashx 文件,采用它來處理Ajax請求,當(dāng)文件需要動態(tài)返回來自查詢字符串或XML和其它非HTML網(wǎng)頁的圖像時。采用JQuery和.NET技術(shù),ashx頁面接收參數(shù),然后返回值.瀏覽頁面時是無法看到編寫的源代碼的.a(chǎn)shx文件在.NET中要繼承IHttpHandler接口,該接口里有IsReusable成員,指定IHttpHandler實例是否可以用來處理多個請求、方法ProcessRequest(HttpContext context)處理接受到的Http請求。
各類WEB應(yīng)用中都有數(shù)據(jù)庫的訪問操作,注冊是一個常用的功能。應(yīng)用Ajax設(shè)計ASP.NET Web注冊頁面,Ajax無刷新感檢測用戶名。測試用戶名是否重名,只刷新部分頁面。
具體設(shè)計思路如下:
(1)需要一個一般處理程序.ashx,傳入用戶名進(jìn)行檢索,設(shè)計Select語句,如果用戶名已使用或未使用返回一個不同值的標(biāo)識變量。
(2)使用JQuery的ajax,這里使用JQuery.get()方式,請求剛才的ashx文件,并將用戶名作為參數(shù)傳過去,get()是Request.QueryString接收,Ajax過程完成之后會返回標(biāo)識變量,再根據(jù)此標(biāo)識確定是否可以使用新填寫的注冊用戶名。
注冊界面設(shè)計如圖2所示:需在網(wǎng)站主目錄中添加JQuery插件jquery-1.4.1-vsdoc.js, 在頁面加上JQuery插件.
圖2 注冊頁面界面
使用.ashx文件(一般處理程序)實現(xiàn)IHTTPHandler接口,不像aspx要繼承Page類,處理控件和事件等, HttpHandler是HTTP請求的真正處理中心,直接用于處理客戶端發(fā)送來的請求,并將服務(wù)器端的處理結(jié)果返回給客戶端.a(chǎn)shx文件的具體處理過程要比aspx要簡單得多。
繼承IHttpHandler接口,重寫ProcessRequest方法(),并添加數(shù)據(jù)庫里查找指定用戶名的方法IsNName().
關(guān)鍵代碼如下:public void ProcessRequest (HttpContext context) {
定義字符串變量resp;
string strName = context.Request.QueryString["userName"];
if (IsNName(strName))
{字符串resp變量值為”1”或”0”}
輸出數(shù)據(jù)(resp);
……
}
private bool IsNName(string strName)
{
bool boolName;
連接數(shù)據(jù)庫;
查找用戶表是否有strName這條記錄;
查找結(jié)果放入boolName真假值;
在注冊Web頁面中,用戶名文本框失去焦點事件CheckUsername(),HTML+JavaScript用$.ajax(url)這個函數(shù)發(fā)送數(shù)據(jù)到ashx文件,此文件用Request.QueryString[...]接收數(shù)據(jù)。
關(guān)鍵代碼如下:
function CheckUsername() {
strName獲取文本框的值;
flag開關(guān);
$.ajax({
……
url: "../ajax/IsName.ashx?userName=" + encodeURI(strName),
success: function(msg) {
{根據(jù)返回信息,給出用戶名是否可用,并設(shè)置開關(guān)flag}
返回flag
}
頁面即時出現(xiàn)提示用戶名是否可用,用戶無刷新抖動的感覺。
圖3 用戶名檢測即時效果
在ASP.NET中實現(xiàn)Ajax,可根據(jù)個人習(xí)慣使用JavaScript、jquery插件,還可以選擇.NET自己封裝的Ajax控件,方法各有特點。
使用Ajax擴(kuò)展EXT 控件,優(yōu)勢在于支持UI,需安裝AjaxControlToolkit,或是需要添加引用System.Web.Extensions.dll。在建Ajax頁面時一定先添加ScriptManager控件, 執(zhí)行Ajax JavaScript庫的鏈接,才能讓Page局部更新起作用。[3]再添加UpdatePanel控件,并在其ContentTemplate內(nèi)容模板添加內(nèi)置控件、表格、HTML代碼等.這樣可以使用很少的客戶端腳本或不使用客戶端腳本就能創(chuàng)建豐富的客戶端行為,局部更新可避免整頁回發(fā)的開銷。需要在Web.Config的
NET Framework 4.0之前版本中使用ASP.NET Ajax ,需要在ScriptManager控件所在頁面,通過腳本調(diào)用Web 服務(wù),要指明Web服務(wù)所在的文件地址,[4]擴(kuò)展名為asmx Web Service文件,WebServices+JQuery可實現(xiàn)Ajax頁面部分刷新;在.NET Framework 4.0以后版本Ajax中調(diào)用WCF服務(wù)。
通過ashx來調(diào)用HttpHandler類,HttpHandler是一個徹底自定義Http請求方法,ashx少了處理了html的過程。免去了普通.aspx頁面的控件解析以及頁面處理的過程,直接返回Web http請求想要返回的結(jié)果,速度快.a(chǎn)shx文件適合產(chǎn)生供瀏覽器處理的、不需要回發(fā)處理的數(shù)據(jù)格式,例如生成動態(tài)圖片、動態(tài)文本等內(nèi)容。
.ashx文件也有缺點,它處理控件的回發(fā)事件非常麻煩,需自己手動完成;并且它只能處理一個請求,如有多個請求需寫對應(yīng)的多個ashx文件。