Asp.net中HttpHandler使用(10)

本章,将首先引出数字水印这一实际的应用,并提出HttpHandly这一技术解决方案,我们将深入的学习ASP.NET运行机制,了解从浏览器发出请求到服务器返回请求这之间是一个这样的过程。

利用本专题的技术我们将解决网站防盗链等一系列实际开发中常间的问题。

数字水印思路分析

实现方式:1.直接编辑每张图片(需要大量的人力,不用)

2.编辑实现批量编辑图片(节省人力,效率高,但原始图片丢失了)

3.在显示图片时,动态添加数字水印效果(使用HttpHandle,本节课所学内容);

实用:指定Handle方式实现数字水印,和全局Handle方式实现数字水印

这里主要后面一个比较实用:

这里需要新建一个被转换的类,如项目中的(BookCoverHandler.cs)

新建的类的代码如下:

public class BookCoverHandler:IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string path = context.Request.PhysicalPath;
        string defaultPath = context.Server.MapPath("~/Images/default.jpg");
        string waterPath = context.Server.MapPath("~/Images/watermark.jpg");
        Image cover;
        if (File.Exists(path))
        {
            cover = Image.FromFile(path);
            Image water = Image.FromFile(waterPath);
            Graphics g = Graphics.FromImage(cover);
            g.DrawImage(water,
                cover.Width - water.Width,
                cover.Height - water.Height,
                water.Width,
                water.Height);
            g.Dispose();
        }
        else
        {
            cover=Image.FromFile(defaultPath);
     }
        context.Response.ContentType = "image/jpeg";
        cover.Save(context.Response.OutputStream, ImageFormat.Jpeg);
        cover.Dispose();
        context.Response.End();
     }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

我们新建类后还需设置配置文件提供全局调用。如下图

实用2:实现防盗链功能

当别人链接你的图片时,显示错误图片。首先说一下实现的流程。

使用场合:两个不同的网站A和B,其中A是本地服务器浏览本地服务器图片C,B也想在网站上显示C图片,于是它盗取A网站上的图片C的地址,但是A网站上对应的服务器设置的防盗链功能,于是B显示的一个错误图片,这就是实现防盗链功能的好处。

首先需要在web.config文件中注册<httpHandle>,如下:

public void ProcessRequest(HttpContext context)
    {
        string path = context.Request.PhysicalPath;
        string defaultPath = context.Server.MapPath("~/Images/default.jpg");
        string waterPath = context.Server.MapPath("~/Images/watermark.jpg");
        Image cover;
        if (File.Exists(path))
        {
            cover = Image.FromFile(path);
            Image water = Image.FromFile(waterPath);
            Graphics g = Graphics.FromImage(cover);
            g.DrawImage(water,
                cover.Width - water.Width,
                cover.Height - water.Height,
                water.Width,
                water.Height);
            g.Dispose();
        }
        else
        {
            cover=Image.FromFile(defaultPath);
        }
        context.Response.ContentType = "image/jpeg";
        cover.Save(context.Response.OutputStream, ImageFormat.Jpeg);
        cover.Dispose();
        context.Response.End();
     }
    public bool IsReusable
    {
        get
        {
            return false;
        }
}

 

posted @ 2012-08-19 22:42  Mr.邹  阅读(172)  评论(0)    收藏  举报