2

我不知道如何为静态文件启用自定义路由。

我想设置我的 asp.net mvc 应用程序以将合成 URL 用于版本化资产。这允许我将静态资产的过期时间设置为最大值,并在我进行构建时增加版本。

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

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

我已经完成了前两个部分,但我不知道如何让静态文件忽略 URL 的一部分。

布局.cshtml

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

我的应用程序.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 处理程序制定了一个可行的解决方案(由sheikhomar提供),以便在它与正则表达式匹配时重写 URL,但是在每个请求上都这样做似乎太过分了:

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));
    }
}
4

1 回答 1

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 文件的路径)。

您可以查阅此答案以获取有关 s 的更多信息FileResult

于 2012-07-18T22:51:05.673 回答