HttpHandler浅析
聲明:本文為翻譯文章,如有侵權,請告知,我將會在1個工作日內刪除,謝謝.
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
總是想著展翅飛翔,但是卻不料一直受傷,但是那尋夢的心啊,永遠向往著遠方.
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
在本文中,我將詳細的向各位講解httphandlers的一般擴展使用方法,以及在何種場合下使用這個方法.首先,需要說明的是,httphandlers是一個繼承自System.IHttpHandler接口的.net組件.她可以通過同步HttpHandler或者是異步HttpHandler的方式被擴展. 一個同步的HttpHandler應當繼承自System.Web.IHttpHandler接口,然而一個異步的HttpHandler卻繼承自System.Web.IHttpAsyncHandler接口.在本文中,我講重點講解同步HttpHandler的使用方法.那么,下面首先要探討的是IHttpHandler接口和她的各類成員. ????? ※ProcessRequest() 這個方法是HttpHandler的核心,她處理所有通過HttpHandler的請求.
????? ※IsReusable() 這個屬性用來區別IHttpHandler是否能夠再次處理相同的請求. 所以,如果擴展HttpHandler的時候,那么上面的方法和屬性必須被實現.
????? 怎么樣來實現?
???? 我下面將會結合著一個例子來說明在一個一般的項目中,我們該在哪兒來使用HttpHandler.現在假設我們正在開發一個項目,而這個項目需要處理成千上萬的圖片.這些相對來說還是比較簡單的,但是難就難在,我們如何在數據庫的BLOB字段中提取出所有的圖片,然后展示出來.一般來說,為了處理這些,我們會建立一個新的頁面,然后將這些圖片以字節流的方式從數據庫中提取出來.生成的代碼可能如下:
?imImage.ImageUrl = "~/ImageHandler.aspx?ImID=100;
在上面,imImage就是一個圖片控件,同時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();
?
?
????? 如果我們考慮著使用上面的代碼段來讓一個aspx頁面去操作一個單獨的數據庫連接的話,那么頁面上其他的內容的展示將顯得不是那么重要了. 同時,一個aspx頁面本身就有一系列的從Init開始到Unload結束的事件,這些事件都是在這個簡單的數據庫操作之前發生的.所以,如果我們利用上面的方法來試著展示更多的圖片到一個頁面上,她的效率的高低,你是懂的. 那么如何來解決這個呢?是時候該HttpHandler出場了.眾所周知,和aspx頁面請求順序比起來,HttpHandler的請求正好是相反的,她在請求的末端被執行.由于HttpHandler只有一個可以處理簡單操作的ProcessRequest的方法,所以,她是不會加載那么多事件的. 但是ProcessRequest方法是如何響應Response對象的呢?
讓我們先看看ProcessRequest:
public void ProcessRequest (HttpContext context) { }
在上面,context對象有權限進入請求的主對象中.比如當我們利用Response對象進行寫字節流的時候,當然,在其他的一些場合下,我們也可以利用HttpHandler,比如如果我們想把DataSet中的內容導出到Excel中,同時我們想保存在我們自定義的文件格式,比如說是.axd,那么我們就必須在配置文件中進行正確的配置才行.
?
<httpHandlers><add verb="supported http verbs" path="path" type="namespace.classname, assemblyname" />
<httpHandlers>
?
?
?上面種,verb代表著請求方式,如”GET,POST”,path可以寫成”.axd”,type則是實際的Handler類型.
利用vs2005開發一個HttpHandler
首先,創建一個新的WebApplication工程,然后添加一個一般處理程序即可,代碼如下:
?
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;
總結
以上是生活随笔為你收集整理的HttpHandler浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Objective-C基础教程》第二章
- 下一篇: 最好的FLV视频下载器 维棠 (支持优酷