C# 如何以编程方式获取捆绑版本令牌?

C# 如何以编程方式获取捆绑版本令牌?,c#,asp.net-mvc,angularjs,single-page-application,bundling-and-minification,C#,Asp.net Mvc,Angularjs,Single Page Application,Bundling And Minification,我们正在使用angularJS开发一个主Web应用程序,作为Cordova移动应用程序的单页应用程序 我们已经将一部分静态资源转移到几个捆绑包中,这些捆绑包将从另一个域的不同CDN WebApp提供服务 我们没有使用@Scripts.Render@Styles.Renderrazor帮助程序,因为捆绑包直接从移动应用程序中嵌入的static index.html引用,如下所示(通过AngularJS追加): 注意: 我们已经知道,我们可以自己创建令牌(例如使用构建号),但是如果能够用更少的精力和

我们正在使用angularJS开发一个主Web应用程序,作为Cordova移动应用程序的单页应用程序

我们已经将一部分静态资源转移到几个捆绑包中,这些捆绑包将从另一个域的不同CDN WebApp提供服务

我们没有使用
@Scripts.Render
@Styles.Render
razor帮助程序,因为捆绑包直接从移动应用程序中嵌入的static index.html引用,如下所示(通过AngularJS追加):

注意

我们已经知道,我们可以自己创建令牌(例如使用构建号),但是如果能够用更少的精力和更多的绑定到捆绑机制,那就太好了。

下面是一个从虚拟捆绑路径获取
v
令牌的简单示例

public class BundleTokenController : ApiController
{
    public string Get(string path)
    {
        var url = System.Web.Optimization.Scripts.Url(path).ToString(); 
        //This will return relative url of the script bundle with querystring

        if (!url.Contains("?"))
        {
            url = System.Web.Optimization.Styles.Url(path).ToString(); 
            //If it's not a script bundle, check if it's a css bundle
        }

        if (!url.Contains("?"))
        {
            throw new Exception("Invalid path"); 
            //If neither, the path is invalid, 
            //or something going wrong with your bundle config, 
            //do error handling correspondingly
        }

        return GetTokenFromUrl(url);
    }

    private static string GetTokenFromUrl(string url)
    {
        //Just a raw way to extract the 'v' token from the relative url, 
        //there can be other ways

        var querystring = url.Split('?')[1];

        return HttpUtility.ParseQueryString(querystring)["v"];
    }
}

您想创建一个服务控制器,这是否意味着您要发出一个http请求来获取版本令牌?或者您更喜欢可以在视图中直接使用的htmlhelper方法?只要你有虚拟路径,获取令牌本身就非常简单。我将发出一个http请求来获取版本令牌。我想你误解了这个问题;由于我们没有使用razor,我们的src脚本没有缓存令牌。@SystemPuntoot但捆绑与razor视图引擎没有任何关系。只要您的后端服务位于asp.net上,您就可以配置捆绑包并使用它,无论是否使用querystring,只要您知道已配置的虚拟路径,就可以获取其url。问题是您到底在哪里需要令牌,据我所知,您需要通过http调用获取令牌,这就是我为您编写APIControllR的原因。如果这不是您想要的,请明确您希望它工作的具体内容。@systempuntoot但我的代码的哪一部分是razor?它是纯C#代码,System.Web.Optimization是.net 4.0/4.5中System.Web.Optimization程序集下的名称空间。若您的后端不在.NETFramework中,那个么故事就会改变。否则,正如我所说,捆绑与razor视图引擎无关。访问捆绑包只需要两件事:1。您在服务器端引用了必要的程序集;2.您已配置bundleplease,请再次阅读问题。由于我们没有使用
@Scripts.Render
@Style.Render
,因为我们是从静态html页面直接访问捆绑包的,所以我们没有获得使用v标记呈现的脚本标记。我们需要的是一种知道给定捆绑路由的v令牌的方法。@SystemPuntoot,如果我理解缓慢,请原谅。让我们逐一确认一下。首先,当您提到
给定的捆绑路线时
。那是
捆绑路线
类似
https://service.foo.it/CDN/cdnFooJs
?或者类似于
~/CDN/cndFooJs
,或者其他什么?
<script src="https://service.foo.it/CDN/cdnFooJs?vtoken=asd3...."></script>
<script src="https://service.foo.it/CDN/cdnFooCss?vtoken=dasdasrq..."></script>
public class BundleTokenController : ApiController
{
    public string Get(string path)
    {
        var url = System.Web.Optimization.Scripts.Url(path).ToString(); 
        //This will return relative url of the script bundle with querystring

        if (!url.Contains("?"))
        {
            url = System.Web.Optimization.Styles.Url(path).ToString(); 
            //If it's not a script bundle, check if it's a css bundle
        }

        if (!url.Contains("?"))
        {
            throw new Exception("Invalid path"); 
            //If neither, the path is invalid, 
            //or something going wrong with your bundle config, 
            //do error handling correspondingly
        }

        return GetTokenFromUrl(url);
    }

    private static string GetTokenFromUrl(string url)
    {
        //Just a raw way to extract the 'v' token from the relative url, 
        //there can be other ways

        var querystring = url.Split('?')[1];

        return HttpUtility.ParseQueryString(querystring)["v"];
    }
}