我无法弄清楚如何为静态文件启用自定义路由。
我想设置我的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));
}
}
答案 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。