详解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的网络共享方式访问图片。但开放文件共享对服务器的安全将构成威胁。

  剖析页面运行原理:
}GR;n [0  当浏览器向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。
!p*B+R,IM:X0  从代码层面来看,要实现自定义的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机器取到,在客户端却看不出来。

时间: 2024-08-01 22:42:52

详解ASP.NET页面的aspx扩展的相关文章

一起谈.NET技术,详解ASP.NET页面的aspx扩展

需求:某网站因业务扩展,需拆分出另一个站点,新旧站点具有相同的内容,但具体栏目表现形式上不一样.原网站运行多年,有大量的图片,这些图片也会在新站上使用.任务是: 保证两个网站图片内容同步,即原来的站点增加一个图片,新站点即可使用这个图片. 分析:假设两个站点的域名分别为:http://www.a_image.com/和http://www.b_image.com/ 1. 将图片分别拷到两台服务器,以后上传图片同时上传两台服务器.这种方法虽简单,但是占用巨大的磁盘空间,而且维护麻烦. 2. 在ht

详解ASP.NET页面的asp“.NET研究”x扩展

需求:某网站因业务扩展,需拆分出另一个站点,新旧站点具有相同的内容,但具体栏目表现形式上不一样.原网站运行多年,有大量的图片,这些图片也会在新站上使用.任务是: 保证两个网站图片内容同步,即原来的站点增加一个图片,新站点即可使用这个图片. 分析:假设两个站点的域名分别为:http://www.a_image.com/和http://www.b_image.com/ 1. 将图片分别拷到两台服务器,以后上传图片同时上传两台服务器.这种方法虽简单,但是占用巨大的磁盘空间,而且维护麻烦. 2. 在ht

aso.net传值-html页面如何接收asp.net页面的session值

问题描述 html页面如何接收asp.net页面的session值 这是一个asp.net页面,想要将用户名传到一个html页面并打印出来,求具体代码 解决方案 在你的asp.net里面写 <% =Session["用户名"] %> 解决方案二: ASP.net 关闭页面时清空SessionASP.net 关闭页面时清空Session

详解ASP.NET页面生命周期_实用技巧

ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我们才能在生命周期的合适阶段编写代码.如果我们能在写代码的时候想着我们现在是在做生命周期的哪一步那将是非常好的. 几个代表性的问题 在开始的时候我们先思考几个问题,看看我们在描述完页面生命周期的时候,能不能回答上这几个问题 1.为什么在服务器端能通过this.textbox1.Text获取到用户提交过来的数

实例详解ASP的上传功能

上传|详解|上传     这个问题已经不是什么新鲜问题了,网上也有大把的教程,但大多数是授人以鱼,而不授人以渔,经过辛苦的资料收集,思考,调试,整理,我基本上已经把这个问题从原理上搞清楚了,现在根据我自己的理解,在范例程序的基础上,加以解释,希望能对部分网友有所帮助. 请诸位大虾能对其中的不正或不良这处予以指正. 我想循序渐进,先讲一个简单的,单个图片文件保存到数据库. 这个范例共包括三个ASP文件和一个数据库(一个表),全部在同一目录下. 1.tblImage 表结构(ACCESS 2000)

实例详解ASP中断开记录集的使用方法

断开|记录集|详解 我们在使用ASP 内置的ADO组件进行数据库编程时,通常是在脚本的开头打开一个连接,并在脚本的最后关闭它,但是就较大脚本而言,在多数情况下连接打开的时间要比它需要打开的时间长得多.因此为了节省服务器资源,应该尽可能关闭连接以释放连接所占有的资源,这种关闭记录集的连接而不关闭记录集的技术叫做断开记录集,这个记录集本身则称为断开的记录集. 下面我们就通过一个实例来说明这种技术的使用方法(NorthWind.mdb是Microsoft Access97自带的一个数据库,文件adov

详解ASP.NET页面生命周期事件_实用技巧

下面是ASP.NET页面初始的过程:1. Page_Init();2. Load ViewState;3. Load Postback data;4. Page_Load();5. Handle control events;6. Page_PreRender();7. Page_Render();8. Unload event;9. Dispose method called; 下面对其中的一些过程作下描述:1. Page_Init();这个过程主要是初始化控件,每次页面载入执行这个初始过程,

PHP asp jsp asp.net 页面的SEO优化方法

PHP页面相比HTML静态页面进行SEO优化有或多或少的不同.一段时间,这些问题会想到许多网站管理员.如果我用我的网站PHP的发展会是搜索引擎教程优化兼容吗?而在PHP中如果使用POST方法,那么会是一个问题?我指的是搜索引擎将不会被困?是的,这将是搜索引擎索引.文件类型并不重要的排名; PHP和HTML平等对待. PHP是一种服务器端脚本语言,是搜索引擎兼容. PHP是完全兼容搜索引擎优化,据我所知这是因为搜索引擎会看到PHP的输出,而不是PHP的代码本身. PHP是一种服务器端脚本语言,在大

详解ASP.NET Core 之 Identity 入门(一)_实用技巧

前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OWIN的东西,所以很多初学者在学习来很费劲,对于 Identity 都是一头雾水,包括我也是,曾经在学 identity 这个东西前后花了一个多月来搞懂里面的原理.所以大部分开发者对于 Identity 并没有爱,也并没有使用它,会觉得被绑架. 值得庆幸的是,在 ASP.NET Core 中,由于对模