ASP.NET HttpHandle数字水印
HttpHandle数字水印
动态地添加数字水印效果,要用到HttpHandle技术。
ASP.NET请求处理过程是基于管道模型的,这个管道模型由多个HttpModule和HttpHandler组成,ASP.NET把HTTP请求依次传递给管道中的各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给客户端。我们可以在每个HttpModule中干预请求的处理过程。
- 事实上我们每请求一个aspx页面都经历了同样的过程,只不过我们没有察觉而已。
- 一个请求可以经过多个Module但是最终只能被一个Handler处理。
HttpHandler的使用
在“添加新项”中添加“一般处理程序”,如图所示。
单击“添加”按钮后,创建一个以.aspx为后缀名的文件。默认创建的内容为:
- public class Handler1 : IHttpHandler //实现IHttpHandler接口
- {
- public void ProcessRequest(HttpContext context)
- {//实现ProcessRequest方法
- context.Response.ContentType = "text/plain";
- context.Response.Write("Hello World");
- }
- public bool IsReusable //实现IsReusable属性
- {
- get
- {
- return false;
- }
- }
- }
数字水印的实现
- 直接编辑每张图片(需要大量的人力)
- 编辑实现批量编辑图片(节省人力,效果高,但原始图片丢失)
- 在显示图片时,动态添加数字水印效果 (使用HttpHandler)
1、使用Handler方式实现数字水印
- public class PicHandler : IHttpHandler
- {
- //普通图片的虚拟路径
- private const string IMG = "~/productimgs/";
- //默认图片的虚拟路径
- private string defaultimg = "~/productimgs/default.jpg";
- //处理方法
- public void ProcessRequest(HttpContext context)
- {
- //定义新的图片
- Image Cover;
- //获取图片物理路径
- string path = context.Request.MapPath(IMG + context.Request.Params["id"].ToString() + ".jpg");
- //判断图片的物理路径是否存在
- if (File.Exists(path))
- {
- //加载图片
- Cover = Image.FromFile(path);
- //定义字体
- Font font = new Font("微软雅黑", 20);
- //定义画布
- Graphics g = Graphics.FromImage(Cover);
- //合成水印图片
- g.DrawString("xiecan.cc", font, Brushes.Red, Cover.Width - 90, Cover.Height - 30);
- //释放画布
- g.Dispose();
- }
- else
- {
- //加载默认图片
- Cover = Image.FromFile(context.Request.MapPath(defaultimg));
- }
- //定义输出类型
- context.Response.ContentType = "image/jpeg";
- //保存图片到输出流
- Cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
- //释放画布
- Cover.Dispose();
- //输出结束
- context.Response.End();
- }
- //是否重用
- public bool IsReusable
- {
- get
- {
- return false;
- }
- }
- }
2、全局Handler方式实现数字水印
使用.aspx方式,需要修改所有访问封面图片的路径,太麻烦,能否在不修改任何访问路径的情况下实现图片的数字水印效果?
实现思路分析
- 修改配置信息,将所有对.JPG内容的访问转到HttpHandler处理程序
- 获得访问请求,得到用户访问的图片路径;
- 根据请求的路径,查找相对应的DVD封面图片;
- 将网站 标识“绘制”在DVD封面图片的左下角;
- 修改程序的输出类型,并将组合出的新图片输出。
配置全局Handler
- <httpHandlers>
- <remove verb="*" path="*.asmx"/>
- <add verb="*" path="ProductImgs/*.jpg" type="第2章_用户控件与HttpHandler.PicCoverHandler"/>
- <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
- <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
- <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
- </httpHandlers>
- verb:谓词GET、POST、FTP等。
- path:访问路径,此处表示所有针对“Productlmgs/*.jpg”路径的请求都将交给PicCoverHandler类进行处理。
- type:指定的处理程序(类)。
URL路径: path="ProductImgs/*.jpg"
指定类名,新建的类:type="第2章_用户控件与HttpHandler.PicCoverHandler"
实现数字水印
- public class PicCoverHandler : IHttpHandler
- {
- //默认图片
- private string defaultimg = "~/productimgs/default.jpg";
- public bool IsReusable
- {
- get { throw new NotImplementedException(); }
- }
- public void ProcessRequest(HttpContext context)
- {
- //实例化图片
- Image Cover;
- //判断图片物理路径是否存在
- if (File.Exists(context.Request.PhysicalPath))
- {
- //加载图片
- Cover = Image.FromFile(context.Request.PhysicalPath);
- //定义字体
- Font font = new Font("微软雅黑", 20);
- //定义画布
- Graphics g = Graphics.FromImage(Cover);
- //合成水印图片
- g.DrawString("xiecan.cc", font, Brushes.Black, Cover.Width - 90, Cover.Height - 30);
- //释放画布
- g.Dispose();
- }
- else
- {
- Cover = Image.FromFile(context.Request.MapPath(defaultimg));
- }
- //定义输出类型
- context.Response.ContentType = "image/jpeg";
- //保存图片到输出流
- Cover.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
- //释放图片
- Cover.Dispose();
- //终止输出
- context.Response.End();
- }
- }
在IIS配置处理程序
在IIS上使用该方式要做其他处理
- 开发服务器仅提供最简单的Web服务器功能,它不对请求的内容做任何处理,而是直接 将所有的请求装交给ASP.NET处理。
- IIS功能比较完善,可以独立处理一些访问请求,比如.html、.jpg等的访问不会提交给 ASP.NET来处理
ASP.NET HttpHandle数字水印相关推荐
- 虚拟主机上用Asp.net实现Urlrewrite
在网上看到,很多朋友在asp.net中做urlrewrite,用的是HttpHandle+Server.Transfer的方法.其实这种方法是错误的.第一,HttpHandle是实现不了urlrewr ...
- Asp.Net页面执行流程分析
在我的上一篇文章中说到了HttpModule.HttpHandle的简单使用,我们可以利用它们在页面请求的过程中加入自己的事件处理程序.那么在一个aspx页面请求时后台到底做了什么?当然asp.net ...
- ASP.NET的SEO:使用.ashx文件——排除重复内容
本系列目录 不同的链接指向的页面如果具有大量相同的内容,这种现象就会被称为"重复内容",如果一个网站的重复内容很多,搜索引擎就会认为这个网站的价值不高.所以我们应尽量避免各种重复内 ...
- Asp.net(C#)面试100+题陆续添加中……
我收集的面试题以及自己对一些面试题的理解: 1.C#不支持多重继承,可以通过接口实现. 2.public 全部公开 private 类内部 protected 自己和自己的子类 ...
- Asp.net中的web.config配置
Asp.net中的web.config配置 Asp.net中的web.config配置... 1 一. 配置文件保存位置... 2 二. 配置文件加载顺序... 2 三. 配置文件节点介绍... 3 ...
- 使用ASP.NET 2.0提供的WebResource管理资源
在 ASP.net 2.0 构建的Web页面中,查看源文件,我们经常会看到下面的Html文本 <script src="/WebResource.axd?d=QfRKDnWw93T08 ...
- asp.net 页面全生命周期
.Net 托管代码和非托管代码的区别 后台代码隐藏/显示前台控件 .Net 页面生命周期 2012-03-21 13:31:08| 分类: .NET | 标签:.net 页面生命周期 c# ...
- 微软项目技术结构思路 ExtJs/JQuery + Asp.net MVC + Wcf service + Entity Framework
正文: 这一阵子在做一个项目, 客户要求使用ExtJs/ vs2008 sql server 2005, 也是好长时间没有去看新的技术和一些框架; 初步设计是准备使用 ExtJs + HTTPHand ...
- asp.net 页面静态化
页面静态化,有三种方式 伪静态 真静态,折中法 现在我做的是折中发 创建一个asp.net 页面, 连接跳转到还未生成的页面 创建HttpHandle类 using System; using ...
最新文章
- java 枚举 下拉框_枚举enum在velocity模板语言中的应用-下拉菜单
- JAVA——实现七牛云对象存储Region对象采用配置方式生成解决方案
- Cassandra Dev 1: Cassandra 入门
- iOS 字典与字符串之间的互转
- linux 复制文件 中文,linux中cp命令如何复制文件
- Paw 百度ai_直面落地!百度EasyDL产业智能创新大赛成果覆盖能源、交通、水利民生重业...
- wpsa3版面怎么变成a4、排版不变_毕业论文排版攻略
- shell 字符截取
- Docker-CE 入门
- Data-mediator入门系列2
- android 发送显示广播,如何查看Android系统当前发送了什么广播
- 2021-08-08备份数据库
- 实时数仓入门训练营:Hologres 数据导入/导出实践
- Enterprise Architect安装包及教程
- 谷歌浏览器部分iframe页面无法打开,跨域问题
- 【MYSQL】误删数据恢复流程说明
- C++17标准STL库并行策略在GCC编译器中的替代实现方法
- Python开发qq批量登陆
- 2017/11/6~2017/11/12学习Java总结
- 按住iPhone按钮时如何阻止Siri打开