首页 新闻 搜索 专区 学院

asp.net mvc 防盗链图片没法进入RouteHandler的问题???

0
悬赏园豆:50 [已解决问题] 解决于 2016-10-17 15:04

demo的参考地址:

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

 

在做一个图片防盗链的demo,但是遇到一些问题。
首先说一下思路,然后再提出所遇到的问题。

防盗链的要点:判断请求否是来自本站点(或者授权站点),如果不是,即判断是盗链,需要返回给提示文件或者404。

1、因为iis对静态文件(图片)的处理方式是找到了就直接返回,所以我们需要让图片请求进入可编程状态,假设,图片的请求和视图的请求一样,可以进入到RouteHandler不就ok了么。


所以我做了如下几步:
1、让图片文件进入路由匹配(RouteCollection),通过设置 RouteTable.Routes.RouteExistingFiles = true;(这句的意思是让所有请求都通过路由来匹配,这么理解是否正确???)
2、添加图片请求处理类 ImageRouteHandler处理图片请求。(如果合法即非盗链,返回正确图片,否则返回404或其他处理)

 

代码如下(我创建的是空的mvc项目) 

ImageHandler.cs 类文件如下:

public class ImageHandler : IHttpHandler
{
    public ImageHandler(RequestContext context)
    {
        ProcessRequest(context);
    }

    private static void ProcessRequest(RequestContext requestContext)
    {
        var response = requestContext.HttpContext.Response;
        var request = requestContext.HttpContext.Request;
        var server = requestContext.HttpContext.Server;
        var validRequestFile = requestContext.RouteData.Values["filename"].ToString();
        const string invalidRequestFile = "thief.png";
        var path = server.MapPath("~/graphics/");

        response.Clear();
        response.ContentType = GetContentType(request.Url.ToString());

        if (request.ServerVariables["HTTP_REFERER"] != null &&
            request.ServerVariables["HTTP_REFERER"].Contains("http://localhost:8010/")) //mikesdotnetting.com
        {
            response.TransmitFile(path + validRequestFile);
        }
        else
        {
            response.TransmitFile(path + invalidRequestFile);
        }
        response.End();
    }

    private static string GetContentType(string url)
    {
        switch (Path.GetExtension(url))
        {
            case ".gif":
                return "Image/gif";
            case ".jpg":
                return "Image/jpeg";
            case ".png":
                return "Image/png";
            default:
                break;
        }
        return null;
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

    public void ProcessRequest(HttpContext context)
    {
        throw new NotImplementedException();
    }
}
ImageHandler.cs

ImageRouteHandler.cs类文件如下:

public class ImageRouteHandler : IRouteHandler
{
    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        return new ImageHandler(requestContext);
    }
}
ImageRouteHandler.cs

RouteConfig.cs 文件(添加路由)

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        RouteTable.Routes.RouteExistingFiles = true;//确保所有路由都通过 RouteCollection 匹配

    }
}
RouteConfig.cs

 

 

问题补充:

怎么都没人回答呢???

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

  你搜一下IIS 上还要不要配置些什么东西

收获园豆:50
balahoho | 老鸟四级 |园豆:2050 | 2016-10-13 09:47

那篇文章没有,我现在在找 静态文件如何通过路由处理。。谢谢!

qingYun | 园豆:43 (初学一级) | 2016-10-13 09:49

@qingYun: 看看这篇文章http://www.cnblogs.com/xyyt/p/3978784.html

balahoho | 园豆:2050 (老鸟四级) | 2016-10-13 09:55

@balahoho: 

http://www.paraesthesia.com/archive/2011/07/21/running-static-files-through-virtualpathprovider-in-iis7.aspx/

差不多,这都需要额外的配置,和我看的那篇文章有点小出入,主贴中没有提到其他配置,而是

RouteTable.Routes.RouteExistingFiles = true;

qingYun | 园豆:43 (初学一级) | 2016-10-13 09:59

@qingYun: web.config里面修改试试

balahoho | 园豆:2050 (老鸟四级) | 2016-10-13 10:03

@balahoho: 嗯嗯,谢谢。

qingYun | 园豆:43 (初学一级) | 2016-10-13 10:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册