HttpHandler

1、创建HttpHandler

(1)先添加ASP.NET3.5应用程序

HttpHandler_第1张图片

(2)新建项,添加一般应用程序,后缀.ashx

HttpHandler_第2张图片

(3)默认创建的内容为

HttpHandler_第3张图片

HttpHandler_第4张图片

2、数字水印

数字水印的技术使用,能够很好的保护著作权,防止他人盗用受保护的资源

数字水印的实现可以有三种方式

  • 直接编辑每张图片,(但需要大量的人力)
  • 编程实现批量编辑图片,(节省人力,且提高效率,但丢失了原始的图片)
  • 在显示图片时,动态添加数字水印效果(使用HttpHandler,效率高,节省人力,且可以保存原始图片)

3、数字水印的实现(指定Handler方式)

修改.ashx文件提供的默认代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;


namespace 第二章_课堂练习
{
    /// 
    /// Handler1 的摘要说明
    /// 
    public class Handler1 : IHttpHandler
    {
      private string IMGS = "~/ProductImgs/";

        public void ProcessRequest(HttpContext context)
        {//定义新的图片
            Image img;
            //获取图片的物理路径
          string path = context.Request.MapPath(IMGS + context.Request.Params["id"] + ".jpg");
          
           //判断图片的物理路径是否存在
            if (File.Exists(path))
            {//加载图片
                img = Image.FromFile(path);
                // 定义画布
               Graphics graphics = Graphics.FromImage(img);
             //在Image上绘制水印
                graphics.DrawString("测试文本",new Font("微软雅黑",20),Brushes.DeepPink,0,0);
                //释放画布
               graphics.Dispose();
            }
            else{
                img = null ;
            
            }
            //设置输出类型为JPEG图片
            context.Response.ContentType = "image/jpeg";
            //将修改的图片存入输出流
            img.Save(context.Response.OutputStream,ImageFormat.Jpeg);
            //释放画布
            img.Dispose();
            //输出结束
            context.Response.End();
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

修改前台数字水印访问图片的路径

HttpHandler_第5张图片

实现效果,如图所示

HttpHandler_第6张图片

4、数字水印实现(全局Handler方式)

使用指定Handler方式的做法仍有缺憾,因为它还需要把图片的路径都修改掉,而全局Handler可以在不修改任何访问路径的情况下实现图片的数字水印效果。

思路分析:

  • 修改配置信息web.config,将所有对.jpg内容的访问转到HttpHandler处理程序
  • 获得访问请求,得到用户访问的图片路径
  • 根据请求的路径查找相对应的图片
  • 将网站标识在封面图片的左下角书输出
  • 修改程序的输出类型,并将组合出的新图片输出    

修改web.config文件,在文件中添加以下代码行


        
      

  • verb:制定谓词列表可以是以逗号分隔的HTTP谓词列表(例如,“GET”,“PUT”,“POST”) [*]通配符,此处标识所有的请求
  • path:指定路径属性可以包含单个URL路径或简单的通配符字符串(如*.aspx),此处代表所有针对“ProductImgs/*.jpg”路径的请求都将交给Handler1类处理
  • type:指定逗号分隔的类/程序集组合

修改.ashx文件提供的默认代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;


namespace 第二章_课堂练习
{
    /// 
    /// Handler1 的摘要说明
    /// 
    public class Handler1 : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {//定义新的图片
            Image img;
            //获取图片的物理路径
          string path = context.Request.PhysicalPath;
           //判断图片的物理路径是否存在
            if (File.Exists(path))
            {//加载图片
                img = Image.FromFile(path);
                // 定义画布
               Graphics graphics = Graphics.FromImage(img);
             //在Image上绘制水印
                graphics.DrawString("测试文本",new Font("微软雅黑",20),Brushes.DeepPink,0,0);
                //释放画布
               graphics.Dispose();
            }
            else{
                img = null ;
            
            }
            //设置输出类型为JPEG图片
            context.Response.ContentType = "image/jpeg";
            //将修改的图片存入输出流
            img.Save(context.Response.OutputStream,ImageFormat.Jpeg);
            //释放画布
            img.Dispose();
            //输出结束
            context.Response.End();
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

此代码与上述代码非常相似,只不过我们不需要获取ID值,也不需要在修改前台图片的访问路径。

HttpHandler_第7张图片

实现效果

HttpHandler_第8张图片                    

当我们使用全局Handler时,后台代码写好不动,前台添加新的图片路径,一样可以添加数字水印效果

例:

HttpHandler_第9张图片

HttpHandler_第10张图片

注意:使用这种配置方式,在开发服务器上运行时没有任何问题,可是当我们将网站部署到IIS上运行时,就会没有任何的效果。原因是我们在开发调试时使用的VS提供的开发服务器,它仅提供了最简单的Web服务器功能,它不会对请求内容做任何的处理,而直接将所有的请求转交给ASP.NET处理。IIS却是一个比较完善,功能强大的Web服务器。我们所有提交到的 IIS的请求,都会依据后缀名而做一些分类处理。默认情况下,.html、.jpg等静态格式文件IIS不会做任何处理而直接将结果返回。只有当后缀名符合相关条件时(如.aspx,asp)才会将请求扎un交给相应的处理程序。                                                                                                                                  HttpHandler_第11张图片                                                                                                                                                                                                                                                  






你可能感兴趣的:(ASP.NET网站开发)