设置asp.net MVC静态资产的合成路由

时间:2012-07-17 18:56:42

标签: c# asp.net asp.net-mvc asp.net-mvc-routing asp.net-mvc-4

我无法弄清楚如何为静态文件启用自定义路由。

我想设置我的asp.net mvc应用程序,以便为版本化资产使用合成URL。这允许我将静态资产的expires设置为max,并且每当我进行构建时都要增加版本。

在编写cshtml模板时,我想将该版本放入静态资源的路径中。最后,我需要设置路由以忽略URL的版本组件,并仅提供静态资产。

例如:/js/1.2.3.4/libs/require.js - > /js/libs/require.js

我有前两部分正在运行,但我无法弄清楚如何忽略静态文件的URL部分。

Layout.cshtml

...
<script data-main="/js/@(((myApplication)(HttpContext.Current.ApplicationInstance)).Version)/config"
    src="/js/@(((myApplication)(HttpContext.Current.ApplicationInstance)).Version)/libs/require.js"></script>
...

myApplication.cs

public class myApplication : HttpApplication {

...

    public string Version { 
        get {
            var baseVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();
#if DEBUG
            var span = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0).ToLocalTime());
            baseVersion += "_" + span.TotalMilliseconds;
#endif
            return baseVersion;
        }
    }
}

修改

我设法使用应用程序中的OnBeginRequest处理程序创建workable solution(由sheikhomar提供),以便在匹配正则表达式时重写URL,但在每个请求上执行此操作似乎过多:< / p>

private readonly Regex jsPattern = new Regex("^/js/[0-9._]*/(.*)$", RegexOptions.IgnoreCase);

protected void OnBeginRequest(Object sender, EventArgs e) {
    var match = jsPattern.Match(Request.Url.AbsolutePath);
    if (match.Success) {
        var fileName = match.Groups[1].Value;
        Context.RewritePath(string.Format("/js/{0}", fileName));
    }
}

1 个答案:

答案 0 :(得分:3)

我建议让MVC处理这条路线。在正常的MVC路由处理之外进行URL重写是我建议反对的,除非你有充分的理由。 ASP.NET MVC的目的是消除进行这些低级操作的需要。

无论如何,在MVC中,映射您的路线类似于:

routes.MapRoute("staticJs", "js/{version}/{*fileName}", new { controller = "Static", action = "Js" });

然后在StaticController

public ActionResult Js(string version, string fileName) {
  var basePath = @"c:\path\to\js";
  var realPath = Path.Combine(basePath, fileName);
  return File(realPath, "application/javascript");
}

将文件流回客户端(假设c:\path\to\js是磁盘上javascript文件的路径)。

有关FileResult的详细信息,请参阅this answer