HttpHandler浅析
聲明:本文為翻譯文章,如有侵權(quán),請(qǐng)告知,我將會(huì)在1個(gè)工作日內(nèi)刪除,謝謝.
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
總是想著展翅飛翔,但是卻不料一直受傷,但是那尋夢(mèng)的心啊,永遠(yuǎn)向往著遠(yuǎn)方.
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
在本文中,我將詳細(xì)的向各位講解httphandlers的一般擴(kuò)展使用方法,以及在何種場(chǎng)合下使用這個(gè)方法.首先,需要說(shuō)明的是,httphandlers是一個(gè)繼承自System.IHttpHandler接口的.net組件.她可以通過(guò)同步HttpHandler或者是異步HttpHandler的方式被擴(kuò)展. 一個(gè)同步的HttpHandler應(yīng)當(dāng)繼承自System.Web.IHttpHandler接口,然而一個(gè)異步的HttpHandler卻繼承自System.Web.IHttpAsyncHandler接口.在本文中,我講重點(diǎn)講解同步HttpHandler的使用方法.那么,下面首先要探討的是IHttpHandler接口和她的各類(lèi)成員. ????? ※ProcessRequest() 這個(gè)方法是HttpHandler的核心,她處理所有通過(guò)HttpHandler的請(qǐng)求.
????? ※IsReusable() 這個(gè)屬性用來(lái)區(qū)別IHttpHandler是否能夠再次處理相同的請(qǐng)求. 所以,如果擴(kuò)展HttpHandler的時(shí)候,那么上面的方法和屬性必須被實(shí)現(xiàn).
????? 怎么樣來(lái)實(shí)現(xiàn)?
???? 我下面將會(huì)結(jié)合著一個(gè)例子來(lái)說(shuō)明在一個(gè)一般的項(xiàng)目中,我們?cè)撛谀膬簛?lái)使用HttpHandler.現(xiàn)在假設(shè)我們正在開(kāi)發(fā)一個(gè)項(xiàng)目,而這個(gè)項(xiàng)目需要處理成千上萬(wàn)的圖片.這些相對(duì)來(lái)說(shuō)還是比較簡(jiǎn)單的,但是難就難在,我們?nèi)绾卧跀?shù)據(jù)庫(kù)的BLOB字段中提取出所有的圖片,然后展示出來(lái).一般來(lái)說(shuō),為了處理這些,我們會(huì)建立一個(gè)新的頁(yè)面,然后將這些圖片以字節(jié)流的方式從數(shù)據(jù)庫(kù)中提取出來(lái).生成的代碼可能如下:
?imImage.ImageUrl = "~/ImageHandler.aspx?ImID=100;
在上面,imImage就是一個(gè)圖片控件,同時(shí)ImageHandler.aspx的代碼如下:
?
string imageid = context.Request.QueryString["ImID"];SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString);
connection.Open();
SqlCommand command = new SqlCommand("select Image from Image where ImageID="+imageid, connection);
SqlDataReader dr = command.ExecuteReader();
dr.Read();
context.Response.BinaryWrite((Byte[])dr[0]);
connection.Close();
context.Response.End();
?
?
????? 如果我們考慮著使用上面的代碼段來(lái)讓一個(gè)aspx頁(yè)面去操作一個(gè)單獨(dú)的數(shù)據(jù)庫(kù)連接的話,那么頁(yè)面上其他的內(nèi)容的展示將顯得不是那么重要了. 同時(shí),一個(gè)aspx頁(yè)面本身就有一系列的從Init開(kāi)始到Unload結(jié)束的事件,這些事件都是在這個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)操作之前發(fā)生的.所以,如果我們利用上面的方法來(lái)試著展示更多的圖片到一個(gè)頁(yè)面上,她的效率的高低,你是懂的. 那么如何來(lái)解決這個(gè)呢?是時(shí)候該HttpHandler出場(chǎng)了.眾所周知,和aspx頁(yè)面請(qǐng)求順序比起來(lái),HttpHandler的請(qǐng)求正好是相反的,她在請(qǐng)求的末端被執(zhí)行.由于HttpHandler只有一個(gè)可以處理簡(jiǎn)單操作的ProcessRequest的方法,所以,她是不會(huì)加載那么多事件的. 但是ProcessRequest方法是如何響應(yīng)Response對(duì)象的呢?
讓我們先看看ProcessRequest:
public void ProcessRequest (HttpContext context) { }
在上面,context對(duì)象有權(quán)限進(jìn)入請(qǐng)求的主對(duì)象中.比如當(dāng)我們利用Response對(duì)象進(jìn)行寫(xiě)字節(jié)流的時(shí)候,當(dāng)然,在其他的一些場(chǎng)合下,我們也可以利用HttpHandler,比如如果我們想把DataSet中的內(nèi)容導(dǎo)出到Excel中,同時(shí)我們想保存在我們自定義的文件格式,比如說(shuō)是.axd,那么我們就必須在配置文件中進(jìn)行正確的配置才行.
?
<httpHandlers><add verb="supported http verbs" path="path" type="namespace.classname, assemblyname" />
<httpHandlers>
?
?
?上面種,verb代表著請(qǐng)求方式,如”GET,POST”,path可以寫(xiě)成”.axd”,type則是實(shí)際的Handler類(lèi)型.
利用vs2005開(kāi)發(fā)一個(gè)HttpHandler
首先,創(chuàng)建一個(gè)新的WebApplication工程,然后添加一個(gè)一般處理程序即可,代碼如下:
?
using System;using System.Web;
using System.Configuration;
using System.Data.SqlClient;
public class ImageHandler : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
string imageid = context.Request.QueryString["ImID"];
SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString);
connection.Open();
SqlCommand command = new SqlCommand("select Image from Image where ImageID="+imageid, connection);
SqlDataReader dr = command.ExecuteReader();
dr.Read();
context.Response.BinaryWrite((Byte[])dr[0]);
connection.Close(); context.Response.End();
}
public bool IsReusable
{
get { return false; } }
}
?
?
可以利用如下代碼展示圖片: imImage.ImageUrl = "~/ImageHandler.ashx?ImID=100;
總結(jié)
以上是生活随笔為你收集整理的HttpHandler浅析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《Objective-C基础教程》第二章
- 下一篇: 最好的FLV视频下载器 维棠 (支持优酷