C# 为asp.net MVC静态资产设置合成路由
我不知道如何为静态文件启用自定义路由。 我想将我的asp.net mvc应用程序设置为对版本化资产使用合成URL。这允许我将静态资产的expires设置为max,并在每次生成时增加版本 在编写cshtml模板时,我希望将该版本放入静态资产的路径中。最后,我需要设置路由以忽略URL的版本组件,只为静态资产服务 例如:C# 为asp.net MVC静态资产设置合成路由,c#,asp.net,asp.net-mvc,asp.net-mvc-routing,asp.net-mvc-4,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
/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>
...
编辑:
我设法(出于礼貌)在应用程序中使用OnBeginRequest处理程序在URL与正则表达式匹配时重写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));
}
}
我建议让MVC来处理这条路线。除非你们有很好的理由,否则我建议你们不要在常规MVC路由处理之外重写URL。ASP.NETMVC的目的是消除执行此类低级操作的需要 无论如何,在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
s的更多信息。对于仍感兴趣的人,请检查以下内容:
public ActionResult Js(string version, string fileName) {
var basePath = @"c:\path\to\js";
var realPath = Path.Combine(basePath, fileName);
return File(realPath, "application/javascript");
}