有没有办法使用ASP.NET Bundles交叉应用程序

时间:2014-07-18 01:31:03

标签: asp.net bundle

我使用ASP.NET Web Optimization包来捆绑和缩小javascript / css文件。

我有一些使用相同javascript / css文件的ASP.NET应用程序,现在我在每个应用程序中设置了捆绑包。

我想知道是否有办法在其中一个应用程序中注册bundle,而其他应用程序只是使用它。

关键问题是如何在其他应用程序中获取查询字符串的哈希码,而不是注册包的应用程序。

3 个答案:

答案 0 :(得分:0)

我认为这是不可能的。好吧,没有什么可以阻止你从外部应用程序渲染样式和脚本包。您可以使用本机script标记手动提取捆绑的资源,并指定绝对网址...

<script src="http://domain.com/bundles/jquery"></script>

或在剃刀中使用Scripts.Render助手......

@Scripts.Render("http://domain.com/bundles/jquery")

但是,如果资源服务器更改了这些样式/脚本包的内容,您将遇到缓存问题,因为使用的应用程序将无法解析缓存查询字符串。它无法解决的原因似乎很明显...... Scripts.Render助手使用当前应用程序的Web优化框架来呈现缓存查询字符串,但是,消费应用程序使用了Web优化框架的不同实例。

我不知道这是如何在幕后工作的,我唯一知道的是,当捆绑内容(文件)发生变化时,缓存查询字符串会发生变化。我猜测缓存查询字符串使用某种基于机器键值或某些东西的哈希算法...这只是我推测的但是你可以看看源代码,如果你&# 39;热衷于深入了解...

http://aspnetoptimization.codeplex.com/SourceControl/latest

建议1

因为对于这些问题似乎没有任何解决方法,如果您的项目对于让外部资源服务器为其他应用程序提供常见样式和脚本至关重要。我只是如上所述手动访问它们,并通过在捆绑名称末尾附加一个数字来对资源进行版本化...

@Scripts.Render("http://server.com/bundles/name1")

每次更新资源时,请更新您的应用程序以引用正确的版本,以避免浏览器呈现旧的缓存版本。

建议二

另一种方法(不会给上面的任何一个带来任何新东西)就是实现你自己的优化程序,这似乎并不那么难。如果您需要,它可能会提供一些灵活性。看看这个Ayende's article ...确保你也阅读了评论

就个人而言,我不喜欢他将文件名添加到查询字符串的方式,但是,只要你能够解决这些文件包,你就不必这么做了。网址。

答案 1 :(得分:0)

您可以通过以下方式完成此操作,但代价是在其他应用程序中,这些已呈现已经过优化,而不是像使用捆绑调试版本时那样逐个实现。

假设您在已定义所有捆绑包的应用程序中创建了一个新的CDNController类:

public class CDNController : Controller {
    public ActionResult Script(string id)
    {
        string url = BundleTable.Bundles.ResolveBundleUrl(string.Format("~/bundles/{0}", id));
        if (string.IsNullOrEmpty(url))
        {
            return HttpNotFound();
        }

        return Redirect(url);
    }
}

您需要使用包ID调用action方法。如果您通常会写:

@Scripts.Render("~/bundles/jquery)

您需要通过调用新的操作方法来替换它。如果托管/主应用程序安装在`/ mainapp&#39;的应用程序路径下你会写:

<script src="/mainapp/CDN/Script/jquery"></script>

与第一种方式不同,它不需要您在其他应用程序中注册包,它只需要您编写绝对路径。新的操作方法请求捆绑URL(包括神秘的哈希)并重定向到该地址。例如,它可以重定向到:/mainapp/bundles/frameworks?v=pznFYVbTrRKNlRAgSb6KWMMjBI0qJjNleRyztT6W1gU1。该地址将始终将捆绑包缩小并捆绑在一起。

您也可以创建一个类似的动作方法来渲染CSS包。

答案 2 :(得分:0)

你可以这样做:

var domain="http://www.google.com";

Styles.DefaultTagFormat = "<link href=\"" + domain + "{0}\" rel=\"stylesheet\"/>";
Scripts.DefaultTagFormat = "<script src=\"" + domain + "{0}\"  type=\"text/javascript\"></script>";

致电时:

Styles.Render("~/masterpagecss")

Scripts.Render("~/masterpagejstop")

这将呈现如下:

<link href="http://www.google.comm/masterpagecss?v=cUYMJ2uO6cjidXEjFnWzUVvVS4_GR9OGA45p3oKZJSQ1" rel="stylesheet"/>

<script src="http://www.google.com/masterpagejstop?v=Oay1Ofn63qSMuPEhfoMe9tPsA_Hp9HeG2rAEcaA6RWk1"></script>

我在我的网站上尝试过它,效果很好。

只需确保您使用的域是您网站的绑定,因为我们可以访问这些文件。