静的ファイルのカスタムルートを有効にする方法がわかりません。
バージョン管理されたアセットに合成URLを使用するようにasp.netmvcアプリケーションをセットアップしたいと思います。これにより、静的アセットの有効期限を最大に設定し、ビルドを実行するたびにバージョンをインクリメントすることができます。
cshtmlテンプレートを作成するときに、そのバージョンを静的アセットのパスに入れたいと思います。最後に、URLのバージョンコンポーネントを無視し、静的アセットのみを提供するようにルーティングを設定する必要があります。
例:/js/1.2.3.4/libs/require.js
->/js/libs/require.js
最初の2つの部分は機能していますが、静的ファイルで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ハンドラーを使用して実行可能なソリューション(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));
}
}