zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    谷歌脸书第三方登录
    初步了解Owin
    select2去掉搜索框
    angularjs教程——自定义指令
    angularjs教程——Dom操作相关指令详解
    http://172.21.87.57:8081/seeyon/
    nce 1,a puma at large
    股池
    永清环保
    出门需要带的东西
  • 原文地址:https://www.cnblogs.com/scy251147/p/1921508.html
Copyright © 2011-2022 走看看