2012-07-17 48 views
2

我無法弄清楚如何爲靜態文件啓用自定義路線。爲asp.net MVC靜態資產設置合成路線

我想設置我的asp.net mvc應用程序使用合成的URLs版本資產。這使我可以將我的靜態資產的過期設置爲最大值,並且每次構建時都會增加版本。

我想在編寫我的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; 
     } 
    } 
} 

編輯:

我設法讓一個workable solution(的sheikhomar提供)使用OnBeg在應用inRequest處理程序重寫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)); 
    } 
} 
+0

對於那些仍然感興趣,請檢查此:http://stackoverflow.com/a/1185171/908336 – 2016-03-02 17:02:44

回答

2

我建議只是讓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 s的更多信息,您可以參考this answer