2

静的ファイルのカスタムルートを有効にする方法がわかりません。

バージョン管理されたアセットに合成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));
    }
}
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ファイルへのパスであると想定しています)。

の詳細については、この回答を参照してくださいFileResult

于 2012-07-18T22:51:05.673 に答える