asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET 页面aspx之扩展


发布日期:2022年11月05日
 
ASP.NET 页面aspx之扩展

需求某网站因业务扩展需拆分出另一个站点新旧站点具有相同的内容但具体栏目表现形式上不一样原网站运行多年有大量的图片这些图片也会在新站上使用任务是保证两个网站图片内容同步即原来的站点增加一个图片新站点即可使用这个图片

分析假设两个站点的域名分别为/和/ 将图片分别拷到两台服务器以后上传图片同时上传两台服务器这种方法虽简单但是占用巨大的磁盘空间而且维护麻烦

在/的页面上直接写/的引用这种方式类似图片盗链但工作量也很大每加一个图片都要改链接日后维护工作也很大

一台服务器保留图片另外一台服务器通过IIS的网络共享方式访问图片但开放文件共享对服务器的安全将构成威胁

剖析页面运行原理

当浏览器向IIS请求页面时IIS会把请求转交给ASPNET HTTP管道HTTP管道是一组被控对象(HTPPModel)这些对象按顺序处理请求并把这些请求转换成一般的HTML文本HTTP管道的入口是HttpRuntime类的实体HttpRuntime类实体从内存程序池中选择一个HttpApplication对象HttpApplication的主要工作是寻找这样的类实体(HttpHandler)使之能够处理请求应用程序能在WebConfig里对这个Http处理句柄映射列表进行重定义下列nfig中的句柄定义了jpg资源请求的处理句柄

<httphandlers>

<add verb=* path=*jpg type=HandlerTest/>

</httphandlers>

Verb列表可以是逗号分隔的HTTP谓词列表(例如GETPUTPOST也可以是通配符*path路径属性可以包含单个URL路径或简单的通配符字符串(例如*aspx)type指定逗号分隔的类/程序集组合ASPNET首先在应用程序的专用\bin目录中搜索程序集DLL然后在系统程序集缓存中搜索程序集DLL

从代码层面来看要实现自定义的HTTP处理句柄只需要实现一个IhttpHandler接口其中包括IsReusable和ProcessRequest两个方法IsReusable方法用于返回应用程序池中是否存在可重用的类实体的信息利用这个方法可以同时为多个请求服务而ProcessRequest方法则接受一个HttpContext实体作为参数从而得到对Request和Response的存取权限

处理思路当对的请求到达IIS时ASPNET初始化一个图像生成器类在这个类中通过HTTP端口把取回来再将图像流返回到HTTP响应中接收并处理HTTP请求是在ProcessRequest方法中完成的客户端并不知道实际发生了什么事情

代码

using System;

using SystemNet; using SystemIO; using SystemWeb; using SystemDrawing; using SystemDrawingImaging;

namespace WebHttpModule

{

public class ImageLink : IHttpHandler

{

public void ProcessRequest(HttpContext context)

{

string url = contextRequestUrlToString(); //if request is / then changed to request / url = urlReplace(/ /);

//如果使用的相对路径就要手工加入完整的url路径if (urlIndexOf(/) <= )

{

url = / + url;

}

//create one WebClient object used to request the image of /

WebClient client = new WebClient();

Stream stream = clientOpenRead(url);

Image image = ImageFromStream(stream); contextResponseContentType = image/jpeg; //将图像写入HTTP响应返回给客户端请求imageSave(contextResponseOutputStream ImageFormatJpeg);

imageDispose();

}

public bool IsReusable

{

get

{

return true;

}

}

}

}

配置

将上面的代码编译为ImageLinkdll在b服务器建立和a机器相同路径的图片目录images并在其下建立bin目录将ImageLinkdll拷进去在b服务器中吧images目录设定为一个应用程序这样才能针对此应用程序设定相应的程序映射(添加相应的扩展)以把jpg后缀的请求发送到ASPNET去处理

在WebConfig中配置代码来设定httpHandlers我们现在要做的把对images目录下的jpg文件的请求转到ImageLink来处理因此最终的设定如下

<httphandlers>

<add verb=* path=images/*jpg type= WebHttpModuleImageLink ImageLink/>

</httphandlers>

将nfig拷到images目录下

到此大工就告成了!所有对b服务器请求的jpg图片都会从a机器取到在客户端却看不出来

上一篇:ASP.NET 2.0 中实现跨页提交

下一篇:使用ASP.NET控件进行程序设计