1 设计处理图片的HttpHandler处理程序
添加一个“一般处理程序”模板,修改其中的代码,如下:
public void ProcessRequest(HttpContext context){
//判断是否是本地引用,如果是则给客户端返回正确的图片,这里的判断用到了http请求中所记录的页信息
//如果是网站,可将“localhost”修改为网站地址
if(context.Request.UrlReferrer.Host=="localhost"){
   //设置客户端缓冲文件过期时间为0,即立即过期
   context.Response.Expires=0;
   //清空服务器端为此会话开辟的输出缓存
   context.Response.Clear();
   //获得文件类型
   context.Response.ContentType="image/jpg";
   //将请求文件写如到输出缓存中
   context.Response.WriteFile(context.Request.PhysicalPath);
   context.Response.End();
}
//如果不是本地引用,则属于盗链引用,给客户端返回错误的图片
else{
   context.Response.Expires=0;
   context.Response.Clear();
   context.Response.ContentType="image/jpg";
   //将报告错误的图片文件写如到输出缓存中
   context.Response.WriteFile(context.Request.PhysicalApplicationPath+"error.jpg");
   context.Response.End();
}
}
public bool IsReusable{
get{
   return true;
}
}
将上述代码复制到一个类文件中,在App_Code目录下
在应用配置中注册HttpHandler,打开“web.config”,在“system.web”节点下,添加处理程序的注册信息,如下:
<httpHandlers>
<add verb="*" path="*.jpg" type="Handler" />
</httpHandlers>
在IIS中配置图片的特殊处理程序
虽然在应用程序中已经配置好了处理“.jpg”文件的程序,但浏览器的请求是直接发送给IIS的,而不是给应用程序,所以还需要在IIS中配置,使得当浏览器请求“.jpg”文件类型时,IIS可以交由ASP.NET处理,配置步骤如下:
(1) 打开系统自带的“Internet信息服务”,在左侧目录树中,右击“网站”节点。在弹出的快捷菜单中,选中“属性”菜单命令,打开网站的属性对话框,切换到“主目录”选项卡界面,单击“配置”按钮,打开“应用程序配置”对话框。“应用程序映射”列表框中,罗列出了IIS所有能够处理的文件格式,以及这些格式对应的处理程序。在此列表框中选中“.aspx”条目,单击“编辑”按钮,打开“添加/编辑应用程序扩展名映射”对话框,在“可执行文件”文本框中的内容为“C:\windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll”。为了让IIS能够将“JPG”格式的文件,正确映射到前面编写的“HttpHandler”处理中,需要为其加载“aspnet_isapi.dll”文件。单击“添加”按钮,打开空白的“添加/编辑应用程序扩展名映射”对话框,在“扩展名”文本框中输入“.jpg”。在“可执行文件”文本框中输入“C:\windows\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll”,单击“确定”,返回到“应用程序配置”对话框,单击“确定”按钮,返回到“网站属性”对话框,在单击其中的“确定”按钮。这样一个防止盗用“.jpg”图片的解决方案就完成了。
防盗链下载实例
以“.rar”压缩包格式为例,实现对非法下载的处理。
在页面中添加一个“LinkButton”控件,并修改其属性“PostBackUrl”为“~/Files/资源文件.rar”。
在类中添加处理请求的方法和返回属性。当请求来自于本站点时,不做任何处理,当请求来自其他站点时,将页面导航到本站的下载页(方法同上),具体代码如下。
public void ProcessRequest(HttpContext context){
if(context.Request.UrlReferrer.Host=="localhost"){
   //允许用户直接下载,不做任何操作
}
else{
   //将请求转到特殊处理页,以实现下载功能
   HttpResponse response=context.Response;
   //导航到下载页面
   response.Redirect(context.Request.PhysicalApplicationPath+"Download.aspx");
}  
}
//返回是否执行此处理程序
public bool IsReusable{
get{
   return true;
}
}
<httpHandlers>
<add verb="*" path="Files/*.rar" type="FileHandler" />
</httpHandlers>
打开IIS,添加应用程序的扩展,扩展名为“.rar”,同上。

转摘自:http://hi.baidu.com/sevenxue2008/blog/item/74f0262694fd0a05908f9d7e.html