ASP.NET中的HttpHander[有例子(转)

原文地址:http://blog.163.com/sun__haiming/blog/static/12830906820099226610677/

 

HttpHander是一般处理程序,他是一个容器 , 通过了解HttpHader会帮助我们进一步了解到 ASP.NET的运行机制。每一个HttapHander其实包括一个及以上的HttpModule的,那么什么是HttpModule呢?

HttpModule:其实每一个ASP.NET中的请求要通过Httpmodule , 但是它并没有对请求进行处理, 真正的处理实在Httphander中执行的 , 就是说每一个请求首先要通过HttpModule的“检查” , 才能才能到达HttpHander的 ;形象地说,好比一个过滤器的作用:

HttpHander:它是Http请求的真正的处理中心 ,在这个容器中ASP.NET真正的对客户端请求道服务器的页面做出编译和执行,然后再将编译好的信息,加载到HttpModule中返回到客户端。

为了更好的理解这个机制, 我写了一个非常形象的例子:

在网上你常常看到一些图片的右下角会有一些标记, 以此来表示图片的来源, 保护自己的版权, 那么这个是怎么做到的呢, 有人说很简单, 对每张图片用制图软件处理不就好了么, 当然可以,但是如果你的网站的图片有上万张怎么办呢?那么还那样做么!很显然这是个很大的体力活,而其还增加了成本!所以在这里我用HttpHander来处理这个问题, [对每次加载的图片我让他经过HttpHander中我让图片的右下角加载水印图片]

1.创建CopyRightCover.ashx  (HttpHander)

<%@ WebHandler Language="C#" Class="BookCover" %>

using System;

using System.Web;

using System.Drawing;

using System.IO;

public class CopyRightCover: IHttpHandler

{

    //数字水印路径

    private const string WATERMARK_URL = "~/Images/WaterMark.jpg";

    //默认图片的路径 当你请求的图片不存在的时候

    private string DEFAULTIMAGE_URL = "~/Images/default.jpg";

    public void ProcessRequest(HttpContext context)

    {

 

        //组合图片的路径 

        string path = context.Request.MapPath(context.Request.Params["path"]);//获得请求的路径

        System.Drawing.Image Cover;

 

        if (File.Exists(path))

        {

            //加载文件

            Cover = Image.FromFile(path);

            //加载水印图片

            Image watermark = Image.FromFile(context.Request.MapPath(WATERMARK_URL));

            //实例化画布

            Graphics g = Graphics.FromImage(Cover);

            //image上绘制水印

            g.DrawImage(watermark, new Rectangle(Cover.Width - watermark.Width, Cover.Height - watermark.Height, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel);

            //释放画布

            g.Dispose();

            //释放水印图片

            watermark.Dispose();

 

        }

        else

        {   //设置默认的图片

            Cover = Image.FromFile(context.Request.MapPath(DEFAULTIMAGE_URL));

        }

        context.Response.ContentType = "image/jpeg"//设置输出类型为jpeg图片

        Cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);        //将修改的图片存入输出流

        Cover.Dispose();

        context.Response.End();

        HttpResponse res = context.Response;//请求处理结束后我回到指定的页面

        res.Redirect("~/BookCover.aspx?newPath=" + path); //也可以将处理后的路径回带(也可以不要)

 

    }

    public bool IsReusable

    {

        get

        {

            return false;

        }

    }

}

 2.创建上传图片的页面:

(源)

<html id="Html1" xmlns="http://www.w3.org/1999/xhtml" runat="server" >

        <head>

            <title>WebForm3</title>

 </head>

        <body>

            <form id="Form1" method="post" runat="server">

                 <input id="loadFile" type="file" runat="server" />

                <asp:Button id="Button1" runat="server" Text="Button" OnClick="Button1_Click1"></asp:Button><br/>

                <asp:Image id="Image1" runat="server"></asp:Image></form>

        </body>

</html>

(后置.cs)

 

public partial class BookCover : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

 

    }

    protected void Button1_Click1(object sender, EventArgs e)

    {

        String filename = loadFile.PostedFile.FileName; //获得上传图片的路径

        string fileType = filename.Substring(filename.IndexOf(".")+1, filename.Length - filename.IndexOf(".")-1); //jpg

     

        string basePath = "Upload\\";

        //每次上传的名字我设置为唯一的

        string keepSaveFleName = basePath + System.DateTime.Now.Date.ToShortDateString() + loadFile.PostedFile.ContentLength.ToString() + "new." + fileType;

        //注意keepSaveFleName一定要是虚拟的路径

        loadFile.PostedFile.SaveAs(Server.MapPath(keepSaveFleName));

        //跳转到Httphander处理水印显示在页面上

        Response.Redirect("BookCover.ashx?path="+keepSaveFleName);

        //第一种方式   keepSaveFleName这个为什么有水印呢??这是因为你keepSaveFleName不是当前的路径了而是经Hander处理后的keepSaveFleName

        //Image1.ImageUrl = keepSaveFleName;

        //第二种方式 我将处理后的keepSaveFleName存储到path里面在或的就好了

        Image1.ImageUrl = Request.Params["path"];

    }

}

 

[注意:我在项目中创建了一个CRHttpHander文件夹来装这些文件,在此文件夹创建Upload文件夹来放你上传的图片,创建与CRHttpHander平级目录Images里面放两个图片:default.jpg和WaterMark.jpg]

OK结束了, 您只要将我写的DEMO复制过去试试就好了!

 

posted @ 2011-09-22 18:13  贝加  阅读(469)  评论(0编辑  收藏  举报