如何通过ASP.NET路由路由图像?
我想创建一个动态缩略图大小调整器,以便您可以使用以下URL来获取已resize的图像:
http://server/images/image.jpg?width=320&height=240
我尝试设置这样的路线:
routes.MapRoute(null, "{filename}", new { controller = "Image", action = "Resize" });
但是,如果文件存在于URL,则ASP.NET将绕过路由并仅返回文件。 如何强制ASP.NET路由图像而不是返回磁盘上的内容?
多数民众赞成如何运行asp.net路由,没有其他…如果你想拦截现有文件的请求,你必须使用重写。
更新
好像我在触发器上有点太快了。 似乎有一个属性可以设置,允许您甚至为现有文件强制执行路由。
RouteCollection.RouteExistingFiles属性
http://msdn.microsoft.com/en-us/library/system.web.routing.routecollection.routeexistingfiles.aspx
获取或设置一个值,该值指示ASP.NET路由是否应处理与现有文件匹配的URL。 如果ASP.NET路由处理所有请求,即使是那些与现有文件匹配的请求,则为True; 否则,是的。 默认值为false。
为什么不使用动作来做到这一点? 控制器的操作可以流回图像。 否则,使用ASPX的典型方法是处理程序或处理程序工厂侦听文件扩展名并相应地处理它。 或者使用URL重写来重写请求中的URL。
你也可以考虑:
- 编写模块以在路由到达之前处理这些图像路由(在Web.Config中注册)
- 编写自己的路由处理程序专门处理这些图像。
两者都允许你删除作为控制器写的需要,我认为这是更清洁。
你自己的路由处理程序的非常基本的例子(来自内存)……
注册为正常路线:
/* 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... } }
希望这些帮助。 很多方法来扩展和实现:)
最简单的方法是通过控制器路由所有图像并将图像存储在单独的位置
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
然后,您的控制器将查看正在请求的图像,并从文件系统加载相应的文件。 这将允许您在没有任何特殊处理的情况下做您想做的事情。
怎么样:
routes.MapRoute("Images", "/images/{filename}.jpg", new { controller = "Image", action = "Resize" });
这应该确保只有带有.jpg作为扩展名的URL才能与该路由匹配并得到适当的路由。
另外请记住,您希望按照最具体到最不具体的顺序添加您的操作,最后添加默认操作。
当然,您的操作仍然需要使用filecontentresult提供Image。