使用ImageResizer的友好URL URL MVC4

时间:2013-07-02 20:05:11

标签: .net asp.net-mvc-4 httpmodule friendly-url imageresizer

我刚刚安装了ImageResizer.Net库来测试调整大小的功能。我用nuget安装它,几秒钟后它开始运行但不是我喜欢的方式。我想要一个整齐的网址重写,如/images/{width}/{height}/name.ext,而不是像?width=100&height=200那样古老而丑陋的查询字符串。

我用Application_Start()PipelineConfig.Rewrite用正则表达式实现了它,但是想知道什么是最好的解决方案,特别是关于速度?

2 个答案:

答案 0 :(得分:1)

FriendlyUrls plugin允许这样做,可以作为开发自己的URL语法的起点。但是,我们强烈不鼓励这样做,因为默认语法更接近REST原则。

消除查询字符串可能是当前的时尚,但在您对数据(图像)应用查询/过滤器的情况下,这往往是一个短视的错误,并且您有一个大的查询词汇表。仔细阅读REST指南将证实这一点。将图像大小或其他命令放入路径会增加歧义(是命令还是文件夹?),阻止轻松删除(如何只获取原始图像),并污染URI的清晰度。

使用查询字符串语法可以轻松构建和修改来自StudioJS等javascript UI的命令,并让您RIAPI compliant

答案 1 :(得分:0)

以下是我在ApplicationStart中输入的代码:

Config.Current.Pipeline.Rewrite += delegate(IHttpModule sender, HttpContext context, IUrlEventArgs ev)
{  
  if (ev.VirtualPath.StartsWith(VirtualPathUtility.ToAbsolute("~/images/"), StringComparison.OrdinalIgnoreCase))
  {
    ev.VirtualPath = Regex.Replace(ev.VirtualPath, @"/images/([0-9]+)/([0-9]+)/([^/]+)\.(jpg|png)", delegate(Match match)
   {
     string v = match.ToString();
     ev.QueryString["width"] = match.Groups[1].Value;
     ev.QueryString["height"] = match.Groups[2].Value;
     //ev.QueryString["scale"] = "both";

     return string.Format("/images/{0}.{1}", match.Groups[3].Value, match.Groups[4].Value);

   });
   context.RewritePath(ev.VirtualPath);
  }
};

我在下面使用3.3.3 nuget包:

ImageResizer 
ImageResizer.Mvc 
ImageResizer.MvcWebConfig 
ImageResizer.Plugins.DiskCache
ImageResizer.Plugins.PrettyGifs
ImageResizer.Plugins.SimpleFilters
ImageResizer.WebConfig