欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » ASP.Net » 正文

热门阅读

详解ASP.NET页面的aspx扩展

创建时间:2011年06月16日 22:54  阅读次数:(4951)
分享到:

我们通过本文要谈谈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资源请求的处理句柄:

  1. <httphandlers>  
  2. <add verb=”*” path=”*.jpg” type=”HandlerTest”/>  
  3. </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方法中完成的。客户端并不知道实际发生了什么事情。

代码:

  1. using System;  
  2. using System.Net;  
  3. using System.IO;  
  4. using System.Web;  
  5. using System.Drawing;  
  6. using System.Drawing.Imaging;  
  7.  
  8. namespace WebHttpModule  
  9. {  
  10.     public class ImageLink : IHttpHandler  
  11.     {  
  12.         public void ProcessRequest(HttpContext context)  
  13.         {  
  14.             string url = context.Request.Url.ToString();  
  15.             //if request is http://www.b_image.com/, then changed to request http://www.a_image.com/  
  16.             urlurl = url.Replace("http://www.b_image.com/", "http://www.a_image.com/");  
  17.  
  18.             //如果使用的相对路径,就要手工加入完整的url路径  
  19.             if (url.IndexOf("http://www.a_image.com/") <= 0)  
  20.             {  
  21.                 url = "http://www.a_image.com/" + url;  
  22.             }  
  23.  
  24.             //create one WebClient object, used to request the image of http://www.a_image.com/  
  25.             WebClient client = new WebClient();  
  26.             Stream stream = client.OpenRead(url);  
  27.  
  28.             Image image = Image.FromStream(stream);  
  29.             context.Response.ContentType = "image/jpeg";  
  30.             //将图像写入HTTP响应,返回给客户端请求  
  31.             image.Save(context.Response.OutputStream, ImageFormat.Jpeg);  
  32.  
  33.             image.Dispose();  
  34.         }  
  35.  
  36.         public bool IsReusable  
  37.         {  
  38.             get  
  39.             {  
  40.                 return true; &n
来源:
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 8+65=? 的结果(结果是:73)
结  果: