• 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复制过去试试就好了!

  • 相关阅读:
    【leetcode】9 longest common prefix
    4月份需要整理的问题总结
    JavaScript DOM 编程艺术(第2版)---P1~P9
    JavaScript DOM 编程艺术(第2版)---序中故
    18年3月周末问题汇总
    三目运算+传参+封装的运用实例
    git学习参考博客
    jq实现类名(class)的增删改查
    ztree树集使用(2)
    word2010在正常关闭的情况下,点了“不保存”,如何恢复
  • 原文地址:https://www.cnblogs.com/beijia/p/httphander.html
Copyright © 2020-2023  润新知