回到目录

说在前

对于资源列表页来说,我们经常会把图像做成N多种,大图,小图,中图等等,很是麻烦,在数据迁移时,更是一种痛快,而如果你把图像资源部署到nginx上,那么这种图像缩放就变得很容易了,因为它有自己的过滤器来实现这个功能,只要程序员简单的配置即可(GraphicsMagick),其实在nginx上实现缩略图的方式有很多,而对于IIS服务来说,实现这种缩略图就没有直接的方法了,必须开发人员自己写代码来实现,下面解释两个比较早的技术(被执行的期间比较早,在页面渲染之前)HttpModule和httpHandler,这两个东西我在之前的文章中也已经讲过,细节不再重复。[HttpModule几大事件,HttpHandler实现图像防盗链]

做在后

一 HttpModule对URL地址进行重写,将扩展名为jpg,jpeg,png,gif结尾的URL地址进行复写,让它支持漂亮的缩略图参数,如原地址为:new1.jpg,实现缩略图原地址为:new1.jpg?w=100&h=100,进行Url重写后的漂亮地址为:new1_100x100.jpg,怎么样,是否是很漂亮,有点像MVC 的router吧,呵呵

    /// <summary>/// 实现URL的重写/// </summary>public class UrlRewriteModule : IHttpModule{#region IHttpModule 成员public void Init(HttpApplication context){context.BeginRequest += new EventHandler(Application_BeginRequest);}/// <summary>/// url重写/// .png?w=100&h=100/// _100x100.png/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void Application_BeginRequest(Object sender, EventArgs e){string oldUrl = HttpContext.Current.Request.RawUrl;if (oldUrl.LastIndexOf(".") > -1){string ext = oldUrl.Substring(oldUrl.LastIndexOf(".")).ToLower();//是图像文件if (ext == ".jpg"||ext == ".jpeg"||ext == ".png"||ext == "gif"){var param = oldUrl.Substring(oldUrl.LastIndexOf("_") + 1, (oldUrl.IndexOf(".") - oldUrl.LastIndexOf("_") - 1)).Split(new char[] { 'x' }, StringSplitOptions.RemoveEmptyEntries);//有图像缩放请求if (oldUrl.LastIndexOf("_") > -1){string newUrl = oldUrl.Substring(0, oldUrl.LastIndexOf("_"));newUrl = string.Format(newUrl + ext + "?w={0}&h={1}", param[0], param[1]);//将请求中的URL进行重写
                        HttpContext.Current.RewritePath(newUrl);}}}}#endregion#region IHttpModule 成员public void Dispose(){}#endregion}

二 使用HttpHandler进行对图像的缩放,你的服务器是指与图像资源在一起的那台电脑

    /// <summary>/// 图片动态缩放处理程序/// </summary>public class ImageScalingHandler : IHttpHandler{/// <summary>/// 图像等比例缩放,图像默认为白色/// </summary>/// <param name="image"></param>/// <param name="width"></param>/// <param name="height"></param>/// <returns></returns>private Bitmap CreateThumbnail(Image image, int width, int height){Point point = new Point(0, 0); //图像从那个坐标点进行截取double wRate = 1, hRate = 1, setRate = 1;int newWidth = 0, newHeight = 0;try{if (width == 0) width = image.Width;if (height == 0) height = image.Height;if (image.Height > height){hRate = (double)height / image.Height;}if (image.Width > width){wRate = (double)width / image.Width;}if (wRate != 1 || hRate != 1){if (wRate > hRate){setRate = hRate;}else{setRate = wRate;}}newWidth = (int)(image.Width * setRate);newHeight = (int)(image.Height * setRate);if (height > newHeight){point.Y = Convert.ToInt32(height / 2 - newHeight / 2);}if (width > newWidth){point.X = Convert.ToInt32(width / 2 - newWidth / 2);}Bitmap bit = new Bitmap(width, height);Rectangle r = new Rectangle(point.X, point.Y, (int)(image.Width * setRate), (int)(image.Height * setRate));Graphics g = Graphics.FromImage(bit);g.Clear(Color.White);g.DrawImage(image, r);g.Dispose();return bit;}catch (Exception){throw;}}/// <summary>/// 处理请求/// </summary>/// <param name="context"></param>public void ProcessRequest(HttpContext context){int w = 0, h = 0;int.TryParse(context.Request.QueryString["w"], out w);int.TryParse(context.Request.QueryString["h"], out h);Image image = Image.FromFile(context.Request.PhysicalPath);context.Response.ContentType = "image/jpeg";Bitmap bitMap = CreateThumbnail(image, w, h);bitMap.Save(context.Response.OutputStream, ImageFormat.Jpeg);image.Dispose();bitMap.Dispose();context.Response.End();}public bool IsReusable{get { return false; }}}

三 最后就是在Module和Handler的入口配置的,即如何将它们加入到当然网站中,我们采用web.config配置的方法

 <system.web><httpModules><!-- this is for Classic mode and Cassini --><add name="UrlRewriteModule" type="EntityFrameworks.Web.Core.HttpModules.UrlRewriteModule,EntityFrameworks.Web.Core" /></httpModules></system.web>

<system.webServer><modules runAllManagedModulesForAllRequests="true" ><!--This is for Integrated mode--><add name="UrlRewriteModule" type="EntityFrameworks.Web.Core.HttpModules.UrlRewriteModule,EntityFrameworks.Web.Core" /></modules><handlers><add name="ImageFunction1" path="*.jpg" verb="GET" type="EntityFrameworks.Web.Core.HttpHandlers.ImageScalingHandler,EntityFrameworks.Web.Core"  /><add name="ImageFunction2" path="*.png" verb="GET" type="EntityFrameworks.Web.Core.HttpHandlers.ImageScalingHandler,EntityFrameworks.Web.Core"  /><add name="ImageFunction3" path="*.gif" verb="GET" type="EntityFrameworks.Web.Core.HttpHandlers.ImageScalingHandler,EntityFrameworks.Web.Core"  /><add name="ImageFunction4" path="*.jpeg" verb="GET" type="EntityFrameworks.Web.Core.HttpHandlers.ImageScalingHandler,EntityFrameworks.Web.Core"  />
</handlers>

从上面的代码中,我们可以看到,对于modules来说,那有两种方式注入,一为IIS经典模式下的,另一种是IIS集成模式下的,我们需要分别进行配置。

可以看一下效果,成功的喜悦!

大叔框架集又一成功组件...

回到目录

转载于:https://www.cnblogs.com/lori/p/4755216.html

我心中的核心组件~HttpHandler和HttpModule实现图像的缩放与Url的重写相关推荐

  1. HttpHandler与HttpModule区别

    ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pi ...

  2. 我心中的核心组件(可插拔的AOP)~第十三回 实现AOP的拦截组件Unity.Interception...

    说在前 本节主要说一下Unity家族里的拦截组件,对于方法拦截有很多组件提供,基本上每个Ioc组件都有对它的实现,如autofac,它主要用在orchard项目里,而castle也有以拦截的体现,相关 ...

  3. 选择HttpHandler还是HttpModule?

    阅读目录 开始 理解ASP.NET管线 理解HttpApplication 理解HttpHandler 理解HttpModule 三大对象的总结 案例演示 如何选择? 最近收到几个疑问:HttpHan ...

  4. asp.net Forums 之HttpHandler和HttpModule

    我们先说说IHttpHandler和IHttpModule这两个接口. 微软的解释为: IHttpHandler: 定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请 ...

  5. HttpHandler与HttpModule的用处与区别

    HttpHandler与HttpModule的用处与区别 问题1:什么是HttpHandler? 问题2:什么是HttpModule? 问题3:什么时候应该使用HttpHandler什么时候使用Htt ...

  6. HttpHandler和HttpModule 心得介绍

    HttpHandler和HttpModule--入门 ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHan ...

  7. 我心中的核心组件(可插拔的AOP)~大话开篇及目录

    我心中的核心组件(可插拔的AOP)~大话开篇及目录 http://www.cnblogs.com/lori/p/3247905.html 回到占占推荐博客索引 核心组件 我心中的核心组件,核心组件就是 ...

  8. ASP.NET内部原理(HttpHandler和HttpModule)

    [IT168 技术文档]在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为 inetinfo.exe进程所截获,这个进程实际上就是www服务.截获之后它会将这个请 ...

  9. 我心中的核心组件(可插拔的AOP)~分布式Session组件

    回到目录 对于目前的网站来说,为了满足高可用,高并发,高负载,一台WEB服务器已经远远不够用了,以后的WEB应用服务器应该是一种集群的环境,它们之间使用一些工具进行数据的同步,在由1台变成多台服务器时 ...

最新文章

  1. HTML和JavaScript函数之间的关系
  2. python画旺仔代码_美术生把旺仔牛奶画成抖音网红,看清画的是谁,网友:确认过眼神...
  3. 为什么vs会输出一个框作为结果_检测与分类专辑 | 对精准目标检测的含不确定性的边界框回归...
  4. python3多线程异步爬虫_python3爬虫中多线程进行解锁操作实例
  5. 【转】HashMap集合中key只能为引用数据类型,不能为基本类型
  6. jQuery元素操作
  7. ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
  8. java组装树状结构数据集合_JAVA构建List集合为树形结构
  9. OpenLayers相关资料
  10. SpringBoot项目如何部署到独立的tomcat上
  11. 读《向外行一样思考、像专家一样实践》之 简单、省略、抽象化、例子分析
  12. 【愣锤笔记】能解决80%场景的Git必会知识点
  13. 5月深度学习班第8课rnn_appliacation
  14. python opencv 检测圆
  15. 北理珠计算机专业在广东排第几,重磅!省内同类院校第一 北理珠2019广东投档线公布!...
  16. LTE时域、频域资源
  17. 如何进行软件技术管理?
  18. 好看的登陆界面java_简单又美观的登录界面
  19. 大数据算法培养计划!
  20. 计算机上海专业排名,2019上海软科世界一流学科排名计算机科学与工程专业排名斯坦福大学排名第2...

热门文章

  1. 7-95 倒数第N个字符串 (15 分)
  2. c语言和c 编程的区别吗,C语言和C有什么区别呀?
  3. oracle中只存储两年数据,Oracle中作为永久存储机制的嵌套表的数据追加
  4. 2019递归实现字符串的逆序存储(C++)
  5. 在java程序中怎么造成死锁_java – 了解为什么在此实现中发生死锁
  6. 无法获得 VMCI 驱动程序的版本: 句柄无效。 驱动程序“vmci.sys”的版本不正确。请尝试重新安装 VMware Workstation。 开启模块 DevicePowerOn 的操作失败
  7. 2021浙江高考首考成绩查询,浙江2021选考成绩什么时候出成绩?附2021浙江学考成绩查询时间...
  8. linux的chmod,chown命令 详解
  9. linux显示文本文件指定行数的数据
  10. 如何查看 Linux 中所有正在运行的服务