如何通过ASP.NET路由路由图像?

时间:2010-12-18 01:50:21

标签: c# url-routing asp.net-routing

我想创建一个动态缩略图缩放器,以便您可以使用以下URL来获取已调整大小的图像:

http://server/images/image.jpg?width=320&height=240

我尝试设置这样的路线:

routes.MapRoute(null,
                "{filename}",
                new { controller = "Image", action = "Resize" });

但是如果文件存在于URL,则ASP.NET将绕过路由并仅返回文件。如何强制ASP.NET路由图像而不是返回磁盘上的内容?

5 个答案:

答案 0 :(得分:4)

为什么不使用动作来做到这一点?控制器的动作可以回送图像。否则,使用ASPX的典型方法是处理程序或处理程序工厂侦听文件扩展名并相应地处理它。或者使用URL重写来重写请求中的URL。

答案 1 :(得分:3)

这就是asp.net路由是如何工作的,没有其他的...如果你想拦截对现有文件的请求,你必须使用Rewrite。

<强>更新

似乎我在触发器上的速度有点太快了。似乎有一个属性可以设置,允许您为现有文件强制执行路由。

RouteCollection.RouteExistingFiles属性

http://msdn.microsoft.com/en-us/library/system.web.routing.routecollection.routeexistingfiles.aspx

获取或设置一个值,该值指示ASP.NET路由是否应处理与现有文件匹配的URL。如果ASP.NET路由处理所有请求,即使是与现有文件匹配的请求,则为True;否则,错误。默认值为false。

答案 2 :(得分:2)

你也可以考虑:

  1. 编写模块以在路由到达之前处理这些图像路由(在Web.Config中注册)
  2. 专门编写自己的路由处理程序来处理这些图像。
  3. 两者都允许你删除作为控制器写的需要,我认为这更清洁。

    你自己的路由处理程序的非常基本的例子(来自内存)......

    注册为正常路线:

    /* Register in routing */
    routes.Add("MyImageHandler",
               new Route("my-custom-url/{folder}/{filename}", 
               new ImageRouteHandler())
    );
    
    
    /* Your route handler */
    public class ImageRouteHandler : IRouteHandler
    {
        public IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            string filename = requestContext.RouteData.Values["filename"] as string;
            string folder = requestContext.RouteData.Values["folder"] as string;
            string width = requestContext.HttpContext.Request.Params["w"] as string;
            string height = requestContext.HttpContext.Request.Params["h"] as string;
    
            // Look up the file and handle and return, etc...
        }
    }
    

    希望这些帮助。有很多方法可以扩展和实现:)

答案 3 :(得分:1)

最简单的方法是通过控制器路由所有图像并将图像存储在单独的位置

routes.MapRoute("Images",
            "/images/{filename}",
            new { controller = "Image", action = "Resize" });

/sitebase/images/image.jpg         //public image location
/sitebase/content/images/image.jpg //real image location

然后,您的控制器将查看正在请求的图像,并从文件系统加载相应的文件。这样你就可以在没有任何特殊处理的情况下做你想做的事。

答案 4 :(得分:0)

怎么样:

routes.MapRoute("Images",
        "/images/{filename}.jpg",
        new { controller = "Image", action = "Resize" });

这应该确保只有带有.jpg作为扩展名的网址才能与该路由匹配,并得到适当的路由。

另外请记住,您希望按照最具体到最不具体的顺序添加您的操作,最后添加默认操作。

当然,您的操作仍然需要使用filecontentresult提供Image。