Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为asp.net MVC静态资产设置合成路由_C#_Asp.net_Asp.net Mvc_Asp.net Mvc Routing_Asp.net Mvc 4 - Fatal编程技术网

C# 为asp.net MVC静态资产设置合成路由

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

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

我想将我的asp.net mvc应用程序设置为对版本化资产使用合成URL。这允许我将静态资产的expires设置为max,并在每次生成时增加版本

在编写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>
...
编辑:

我设法(出于礼貌)在应用程序中使用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");
}