7

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

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

我尝试设置这样的路线:

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

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

4

5 回答 5

4

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

于 2010-12-18T02:02:19.797 回答
3

这就是 asp.net 路由的工作原理,没有什么可以解决的……如果要拦截对现有文件的请求,则必须使用 Rewrite。

更新

好像我在那里的触发器有点太快了。您似乎可以设置一个属性,即使对现有文件也可以强制执行路由。

RouteCollection.RouteExistingFiles 属性

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

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

于 2010-12-18T02:01:11.427 回答
2

您还可以考虑:

  1. 在到达路由之前编写一个模块来处理这些图像路由(在 Web.Config 中注册)
  2. 专门编写您自己的路由处理程序来处理这些图像。

两者都可以让您无需编写为控制器,我认为这更清洁。

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

注册为普通路线:

/* 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...
    }
}

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

于 2012-02-22T10:03:53.780 回答
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

然后,您的控制器将查看正在请求哪个图像并从文件系统加载适当的文件。这将允许您在没有任何特殊处理的情况下做您想做的事情。

于 2010-12-18T05:49:19.497 回答
0

怎么样:

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

那应该确保只有以 .jpg 作为扩展名的 URL 才能与该路由匹配并正确路由。

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

当然,您的操作仍然需要使用文件内容结果来提供图像。

于 2011-07-02T13:34:48.710 回答