详解ASP.NET页面的aspx扩展
我们通过本文要谈谈ASP.NET页面的aspx扩展,主要是为了网站业务上的扩展,保持两个网站图片内容同步。希望本文能对大家有所帮助。
需求:某网站因业务扩展,需拆分出另一个站点,新旧站点具有相同的内容,但具体栏目表现形式上不一样。原网站运行多年,有大量的图片,这些图片也会在新站上使用。任务是:
保证两个网站图片内容同步,即原来的站点增加一个图片,新站点即可使用这个图片。
分析:假设两个站点的域名分别为:http://www.a_image.com/和http://www.b_image.com/
1、 将图片分别拷到两台服务器,以后上传图片同时上传两台服务器。这种方法虽简单,但是占用巨大的磁盘空间,而且维护麻烦。
2、 在http://www.b_image.com/的页面上直接写http://www.a_image.com/的引用。这种方式类似“图片盗链”,但工作量也很大,每加一个图片都要改链接。日后维护工作也很大。
3、 一台服务器保留图片,另外一台服务器通过IIS的网络共享方式访问图片。但开放文件共享对服务器的安全将构成威胁。
剖析页面运行原理:
当浏览器向IIS请求页面时,IIS会把请求转交给ASP.NET HTTP管道,HTTP管道是一组被控对象(HTPPModel),这些对象按顺序处理请求并把这些请求转换成一般的HTML文本。HTTP管道的入口是HttpRuntime类的实体。HttpRuntime类实体从内存程序池中选择一个HttpApplication对象,HttpApplication的主要工作是寻找这样的类实体(HttpHandler)使之能够处理请求。应用程序能在Web.Config里对这个Http处理句柄映射列表进行重定义。下列Web.config中的句柄,定义了.jpg资源请求的处理句柄:
<httphandlers> <add verb=”*” path=”*.jpg” type=”HandlerTest”/> </httphandlers>
Verb列表可以是逗号分隔的HTTP谓词列表(例如“GET,PUT,POST”),也可以是通配符“*”;path路径属性可以包含单个URL路径或简单的通配符字符串(例如*.aspx);type指定逗号分隔的类/程序集组合。ASP.NET首先在应用程序的专用\bin目录中搜索程序集DLL,然后在系统程序集缓存中搜索程序集DLL。
从代码层面来看,要实现自定义的HTTP处理句柄,只需要实现一个IhttpHandler接口,其中包括IsReusable和ProcessRequest两个方法。IsReusable方法用于返回应用程序池中是否存在可重用的类实体的信息,利用这个方法可以同时为多个请求服务,而ProcessRequest方法则接受一个HttpContext实体作为参数,从而得到对Request和Response的存取权限。
处理思路:当对www.b_image.com/images/book.jpg的请求到达IIS时,ASP.NET初始化一个图像生成器类,在这个类中,通过HTTP端口把www.a_image.com/images/book.jpg取回来,再将图像流返回到HTTP响应中。接收并处理HTTP请求是在ProcessRequest方法中完成的。客户端并不知道实际发生了什么事情。
代码:
using System; using System.Net; using System.IO; using System.Web; using System.Drawing; using System.Drawing.Imaging; namespace WebHttpModule { public class ImageLink : IHttpHandler { public void ProcessRequest(HttpContext context) { string url = context.Request.Url.ToString(); //if request is http://www.b_image.com/, then changed to request http://www.a_image.com/ urlurl = url.Replace("http://www.b_image.com/", "http://www.a_image.com/"); //如果使用的相对路径,就要手工加入完整的url路径 if (url.IndexOf("http://www.a_image.com/") <= 0) { url = "http://www.a_image.com/" + url; } //create one WebClient object, used to request the image of http://www.a_image.com/ WebClient client = new WebClient(); Stream stream = client.OpenRead(url); Image image = Image.FromStream(stream); context.Response.ContentType = "image/jpeg"; //将图像写入HTTP响应,返回给客户端请求 image.Save(context.Response.OutputStream, ImageFormat.Jpeg); image.Dispose(); } public bool IsReusable { get { return true; } } } }
配置:
1、 将上面的代码编译为ImageLink.dll,在b服务器建立和a机器相同路径的图片目录images,并在其下建立bin目录,将ImageLink.dll拷进去,在b服务器中吧images目录设定为一个应用程序,这样才能针对此应用程序设定相应的程序映射(添加相应的扩展),以把jpg后缀的请求发送到ASP.NET去处理。
2、 在Web.Config中配置代码来设定httpHandlers,我们现在要做的把对images目录下的jpg文件的请求转到ImageLink来处理,因此最终的设定如下:
<httphandlers> <add verb=”*” path=”images/*.jpg” type=” WebHttpModule.ImageLink, ImageLink”/> </httphandlers>
将web.config拷到images目录下。
到此大工就告成了!所有对b服务器请求的jpg图片都会从a机器取到,在客户端却看不出来。
原文标题:ASP.NET 页面aspx之扩展
链接:http://www.cnblogs.com/JeffreyZhao/archive/2009/10/14/aspnet-routing-design-ideas-and-patterns.html
详解ASP.NET页面的aspx扩展相关推荐
- 在asp.net页面的aspx文件中插入代码段
1.插入函数代码段<script runat="server"> 这种方式插入的代码段跟.cs文件中的代码是一致的,在做相应的action时被触发调用. 用于声明ASP ...
- 详解asp.net邮件收发系统
详解asp.net邮件收发系统 通过邮件客户端,不需要登录邮箱网站我们就能直接收发邮件. 1 系统分析 邮件收发是各个网站几乎必备的功能,在用户注册.邮箱确认.邮箱客服.找回密码等环节有典型应用.但是 ...
- C#-Home / 详解Asp.Net Sql数据库连接字符串
C#-Home / 详解Asp.Net Sql数据库连接字符串 2010-04-18 22:00 281人阅读 评论(0) 收藏 举报 1.连接数据库文件 <add name="Loc ...
- 绿建科技加密图纸查看器安装_施工图看不懂?1.1G工程施工图纸详解,253页图文合集一查就清楚...
施工图看不懂?1.1G工程施工图纸详解,253页图文合集一查就清楚 只要是对建筑行业,有所了解的朋友都清楚,钢筋施工图纸对于建筑物,有着举足轻重的地位!一点都不得马虎大意,接触建筑行业,第一步还是需 ...
- 2022.12四级真题第3套答案及详解(共9页pdf)
2022.12四级真题第3套答案及详解(共9页pdf) 内容对于23年考四级的同学很有帮助 2022年12月四级考试全国共考了2套听力,本套真题 听力与前2套内容完全相同,只是顺序不同,故听力题不再重 ...
- [深入学习C#]LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询
此文章非原创,转载自诗人江湖老,原文地址 在Git上下载源码 在工程中我们少不了要定义类或者结构去储存数据,这些数据将被临时地储存在内存中,现在我们想要对其完成一些类似于查找.过滤等等常见的任务的时候 ...
- 怎么修改服务器上的cpt文件,DELL-服务器-RAID-配置详解(28页)-原创力文档
DELL 服务器 RAID 配置详解 磁盘阵列可以在安装系统之前或之后产生,系统会视之为一个(大型)硬盘,而它具有容 错及冗余的功能.磁盘阵列不单只可以加入一个现成的系统,它更可以支持容量扩展,方 法 ...
- 详解ASP.NET页面生命周期事件
下面是ASP.NET页面初始的过程: 1. Page_Init(); 2. Load ViewState; 3. Load Postback data; 4. Page_Load(); 5. Hand ...
- cookie 操作详解 (asp.net javascript)
(1)ASP.NET cookie 操作详解|cookie 写入.读取.修改.删除2008年10月18日 //写入 protected void Button2_Click(objec ...
最新文章
- 法猿生存计划--左边的管理,技术正确
- IIS 7 应用程序池自动回收关闭的解决方案
- 腾讯十周年,看看你的QQ是什么时候注册的?
- Spring事务传递性探讨
- jsp模糊查询_查询知识产权和商标专利的网站汇总!
- shell-grep命令详解(转)
- 如何绘制逻辑图 — 2.要素的属性
- 根据两点之间的连线,计算连线到各坐标轴之间的夹角(角度,弧度)
- LED流水灯程序——小白的单片机笔记
- 自动控制原理学习笔记(五)
- javac编译带有package的java文件
- 51单片机(流水灯)
- 001Diamond学习001概述
- 交叉编译 foo2zjs
- 2021年的EI会议论文发表难度评价
- 基于JAVA springboot + MYSQL +VUE的项目管理系统(含数据库),包括工时统计、原型预览、效果图管理等
- android图片压缩的两个开源库
- Welearn的cookie值怎么获取?
- Java黑皮书课后题第5章:5.3(将千克转换成磅)编写程序,显示下面的表格(注意:1kg为2.2磅)
- [arch Linux] 使用grub实现Linux和Windows双系统的引导
热门文章
- 经典C语言程序100例之十五
- 怎么把图片上的字盖住_吃完大闸蟹怎么去腥?实验了 12 种方法,第 1 名居然是.........
- 11_模型的选择与调优,交叉验证,超参数搜索-网格搜索sklearn.model_selection.GridSearchCV
- 查看当前服务器中的所有的topic,创建topic,删除topic,通过shell命令发送消息,通过shell消费消息,查看topic详情,对分区数进行修改
- Oracl数据库管理方面的资料(查询sga,查看oracle数据库名称sid,查看oracle数据库名称,查看表空间,修改表空间名称,数据库管理,sqlPlus数据显示)
- xml解析:Sax,Dom,pull解析
- linux搭建交换机日志,用LINUX的SYSLOG做交换机、路由器的日志服务器
- 如何查询oracle死锁,Oracle死锁查看和解决办法汇总
- 如何使用Soft-NMS实现目标检测并提升准确率
- CentOS 5.5下LVM的分区管理