首页新闻找找看学习计划

自定义handler处理图片请求??

0
悬赏园豆:30 [已解决问题] 解决于 2017-03-31 12:22


想做一个防盗链的demo,查了一些资料,知道这个demo的要点是改变静态图片请求的默认处理方式(存在即返回),增加可编程性,通过代码控制逻辑判断是否为盗链,最后决定是否返回正确图片。

参考:http://www.mikesdotnetting.com/article/126/asp-net-mvc-prevent-image-leeching-with-a-custom-routehandler

这篇文章提到,如果被请求的图片存在磁盘上,那么会被立即返回,如果不存在磁盘上,会做路由匹配,这就是入口,所以我在首页将img标签的src属性指向磁盘不存在的文件夹上,

Index.cshtml:
<img src="~/Content/imagessss/a.png" />
指向不存在的文件夹imagessss

 

添加路由:
routes.Add("ImagesRoute", new Route("Content/imagessss/{filename}", new ImageRouteHandler()));

图片路由处理类ImageRouteHandler.cs:

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new ImageHandler(requestContext);
    }

 

实际处理类ImageHandler.cs就不贴出来了,要点是图片请求可以匹配到ImageRouteHandler.cs上。

疑问点:我尝试了好多遍,不管请求指向是否存在磁盘上,请求都不会进行路由匹配,除非我在web.config添加配置:runAllManagedModulesForAllRequests="true",并且设置RouteTable.Routes.RouteExistingFiles = true;,这两条必须都设置为true,图片请求才会有路由匹配,当然,不论请示指向的文件夹是否存在。这和参考文有较大出入了?前者通过请求的文件是否存在决定是否匹配路由,后者(我现在的方式)是产用一棒子方式,设置所有请求都通过路由匹配,问题出在哪儿???

没有多余的豆了,谢谢你的回答!!

问题补充:

mvc 版本号 5.2.3.0

qingYun的主页 qingYun | 初学一级 | 园豆:43
提问于:2016-10-17 15:26
< >
分享
最佳答案
0

这些文件,没记错的话,默认是由static file模块处理的,也就是runAllManagedModulesForAllRequests="false"的情况。

你引用的文章也没说不需要设置runAllManagedModulesForAllRequests,倒不算有出入。

收获园豆:30
c99 | 小虾三级 |园豆:1832 | 2016-10-18 19:46

嗯嗯,谢谢!

不过我想要一个最简洁且有针对性的方案,我觉得如果有的话应该会提到。

这个设置太重量级了,找了一些资料,都建议不要轻易设置这个!

qingYun | 园豆:43 (初学一级) | 2016-10-18 20:32

@qingYun: 很简单的处理啊,除了后缀名为jpeg/jpg/png/gif的请求由你的handler处理外,其它的直接return返回,由static file模块处理即可。

c99 | 园豆:1832 (小虾三级) | 2016-10-19 17:01

@c99: 我需要添加自定义逻辑!所以我继承 IHttpHandler 去处理,

关键是我需要一种轻量级的方式,让图片请求匹配到我的路由上。。。

iis7 mvc 5.2...

qingYun | 园豆:43 (初学一级) | 2016-10-20 12:30

@qingYun: 这没有重量到哪里去啊,你自己实践一下就知道了。别人说的终究都是“听别人说”,真正如何还是得自己动手。

c99 | 园豆:1832 (小虾三级) | 2016-10-20 14:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册