标签: system.web.optimization

IItemTransform和现有的缩小文件

TL; DR:IItemTransform当缩小文件已存在于与原始(非缩小)文件相同的文件夹中时,未执行.

问题解释

我有这个问题主要是因为CSS相对图像引用.如果您使用IItemTransformJavascript文件,则同样适用.

这就是我正在使用的:

  1. 我正在使用带有Web Essentials插件的Visual Studio来支持LESS文件
  2. 我正在编写LESS文件,并且Web Essentials插件会在保存时自动缩小文件
  3. 我也在我的项目中使用捆绑和缩小
  4. 在创建CSS包时,我正在使用CssRewriteUrlTransformCSS URL绝对(即背景图像),以便在将几个CSS文件捆绑在一起后图像仍然可用

到目前为止没有什么不寻常的,但它不起作用.

什么似乎是问题?

捆绑和缩小工作的方式是它试图避免过度处理.这意味着当缩小文件与原始文件存在于同一文件夹中时,它将不会运行自己的缩小,而是提供现有文件.

只要它至少会对那些预先存在的缩小文件进行转换,这样就可以了.但事实并非如此.所以我最终得到了一个捆绑包中的相对URL,这几乎打破了所有这些资源.

解决方法

  1. 始终在LESS文件中提供绝对路径
  2. 在Web Essentials设置中保存时禁用文件缩小
  3. 在定义我的软件包时请参阅缩小的文件,因为它们没有缩小版本(*.min.css没有*.min.min.css)所以minifier实际上会拾取文件并缩小,同时还运行转换它.

从我的开发过程和使用的工具(并按照它们的方式配置)的角度来看,这看起来像一个bug.如果这些文件是同一缩小过程的结果,那么这根本就不是一个错误,因为在缩小执行时将执行转换.确实,这样的功能不存在,并且可能永远不会因为应用程序需要写入权限才能使其工作.结果:这是一个错误.在缓存之前,应通过转换处理现有的缩小文件.

是否有可能以某种方式说服捆绑和缩小:

  1. 不使用现有的缩小文件版本
  2. 在现有的缩小版本上运行转换

css asp.net transformation bundling-and-minification system.web.optimization

27
推荐指数
1
解决办法
1211
查看次数

你可以预先缓存ASP.NET Bundles吗?

每次部署MVC Web应用程序时,我的服务器都必须重新缓存所有js和css包.

因此,部署后第一个视图渲染可能需要几秒钟.

有没有办法预先缓存包?毕竟,文件在编译时是静态的.

c# asp.net asp.net-optimization system.web.optimization

15
推荐指数
1
解决办法
2831
查看次数

如何使用System.Web.Optimization包来处理IIS虚拟目录中的自定义文件夹?

我有一个asp.net mvc4.我有使用IIS虚拟目录在此应用程序中部署为子目录的模块,我需要引用这些模块中的文件.这些模块dll正在注册捆绑包.但捆绑包不会在html页面中生成任何内容.

从这篇文章中可以看出,它可能是单元测试-bicleconfig-in-mvc4,我看到内部捆绑包正在使用Server.MapPath.所以它似乎应该工作.

我连接了BundleTable.MapPathMethod,甚至自己调用了Server.MapPath,它正确地解析到了正确的物理目录.但它仍然不会在html页面中呈现任何内容.

然后就是这篇帖子,为什么做了解决方案,不为自定义文件夹工作,提到自定义文件夹的"AddDirectory"功能但是这个功能在最新的优化库中不再可用.

我也试过使用新的"IncludeDirectory"方法,但这也不起作用

ScriptBundle scriptBundle = new ScriptBundle("~/bundles/jquery");
scriptBundle.IncludeDirectory(basePath + "/Scripts/","jquery-1.*");
bundles.Add(scriptBundle);
Run Code Online (Sandbox Code Playgroud)

还有什么我可以尝试使这项工作?


12年8月27日

问题解答:基本上,System.Web.Optimization不适用于作为子IIS虚拟目录的Web URL.

问题是BundleResolver.GetBundleContents中的这些代码行

string mapPathMethod = this.MapPathMethod("~/");
if (!file.FullName.StartsWith(mapPathMethod, StringComparison.OrdinalIgnoreCase))
Run Code Online (Sandbox Code Playgroud)

这基本上假设捆绑的每个文件都位于主Web应用程序PHYSICAL文件夹下的PHYSICAL文件夹中.

IMO的问题在于,正在搜索要包含的文件的Web相对URL路径很早就被转换为物理路径,并且所有对用于获取这些物理文件的相对URL路径的引用都被丢弃了.

所以,为了看看我是否可以完成这项工作,我不得不将System.Web.Optimization反编译为裸代码,然后再重新编译,以便我可以"修复"它.第一步是将一个RelativePath属性添加到BundleItem,这是BundleItem的一个额外构造函数,用于传递源相对url路径以保留Web相对搜索目录文件夹的内容.然后我用循环替换上面的代码,然后基本上尝试重新匹配用BundleItem找到的文件,以便它们可以转换回有效的web url

foreach (BundleItem bundleItem in bundleFor.Items)
{
  if (file.FullName.StartsWith(bundleItem.Path, StringComparison.OrdinalIgnoreCase)){
    string str = file.FullName.Replace(bundleItem.Path,bundleItem.RelativePath);
    str = str.Replace('\\', '/');
    strs.Add(str);
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我的捆绑包正在渲染.但请注意,我尚未测试此hack修复程序是否已发布或已进行优化或缩小.

我真的认为asp.net团队应该在IIS虚拟目录中制作System.Web.Optimizations支持文件.特别是现在VS2012支持IIS Express,最终使构建模块化Web应用程序变得更容易,文件通过IIS虚拟目录引用

.net asp.net-mvc-4 asp.net-optimization system.web.optimization

11
推荐指数
1
解决办法
3719
查看次数

从Minifying中删除单个文件?

我正在尝试使用ASP.Nets BundleTable来优化一些javascript文件,但是遇到了一个问题,当代码被缩小时,特定的插件(jQuery-Timepicker)无法工作.看到这里.

捆绑代码目前类似于:

// Add our commonBundle
var commonBundle= new Bundle("~/CommonJS" + culture.ToString());

// JQuery and related entries.
commonBundle.Include("~/Scripts/jquery-1.7.2.js");
commonBundle.Include("~/Scripts/jquery-ui-1.8.22.js");
commonBundle.Include("~/Scripts/jquery.cookie.js");
commonBundle.Include("~/Scripts/jquery-ui/jquery-ui-timepicker-addon.js"); // This is the one that does not work when bundled

// JS Transformer
commonBundle.Transforms.Add(new JsMinify());

BundleTable.Bundles.Add(commonBundle);
Run Code Online (Sandbox Code Playgroud)

如果我删除该jquery-ui-timepicker-addon.js文件,然后将其单独包含在我的网页中,那么它可以正常工作.(否则我得到Uncaught TypeError: undefined is not a function错误).

我想知道我是否能以某种方式设置我的捆绑代码以跳过缩小这个文件(但仍然包含在捆绑中)?我一直在环顾四周,但没有提出任何解决方案.

bundle asp.net-mvc-3 asp.net-mvc-4 asp.net-optimization system.web.optimization

8
推荐指数
1
解决办法
1406
查看次数

使用System.Web.Optimization时,如何将type ="text/javascript"添加到脚本标记中

我有以下内容

bundles.Add(new ScriptBundle("~/bundles/scripts/common").Include(
                  "~/Scripts/jquery.validationEngine.js",
                  "~/Scripts/common.js"));
Run Code Online (Sandbox Code Playgroud)

哪个生成

<script src="/bundles/scripts/common?v=9O0Yi3fV_GWpGyJQ_QYURiOYy6SEmxUQtkUVN4GXo2U1"></script>
Run Code Online (Sandbox Code Playgroud)

使用时渲染

    <asp:PlaceHolder ID="PlaceHolderJs" runat="server">                
            <%: Scripts.Render("~/bundles/scripts/common") %>
    </asp:PlaceHolder>
Run Code Online (Sandbox Code Playgroud)

哪个不是有效的HTML,因为它缺少类型="text/javascript".如何使BundleCollection在脚本标记中输出此元素?

asp.net xhtml bundling-and-minification system.web.optimization

8
推荐指数
1
解决办法
5881
查看次数

让System.Web.Optimization在类库中的剃刀视图中工作

我正在构建一个模块化的MVC4应用程序,其中每个模块(= area)都是一个类库.模型和控制器编译成.dll,视图被复制到相应的文件夹中.在运行时,一切正常.在设计时,还有一个恼人的问题:在类库中编辑剃刀视图时,Visual Studio无法识别System.Web.Optimization命名空间.

The name "Styles" does not exist in the current context.
The name "Scripts" does not exist in the current context.
Run Code Online (Sandbox Code Playgroud)

我尝试将程序集添加到root和内部web.config中的system.web/compilation部分:

<add assembly="System.Web.Optimization, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
Run Code Online (Sandbox Code Playgroud)

我没有特定的版本也尝试过它.这两种方法都没有解决问题,但是触发了asp.net运行时错误(在剃刀视图的第一行可见):

Could not load file or assembly 'System.Web.Optimization, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.
Run Code Online (Sandbox Code Playgroud)

程序集在项目中引用,"Copy Local"设置为"True".它还被添加为剃刀配置部分中的命名空间.

我怀疑这是我将来遇到的其他组件的一般问题.

编辑:我做了一般设置,让Intellisense进入类库中的剃刀视图.到目前为止,一切都有效,除了VS2010无法识别优化命名空间.

asp.net-mvc asp.net-mvc-areas razor asp.net-mvc-4 system.web.optimization

7
推荐指数
2
解决办法
1万
查看次数

在system.web.optimization中自定义缓存清除

在优化开启时从包中呈现样式时,您可以获得:

<link href="/Content/themes/base/css?v=UM624qf1uFt8dYtiIV9PCmYhsyeewBIwY4Ob0i8OdW81" rel="stylesheet" type="text/css" />
Run Code Online (Sandbox Code Playgroud)

不幸的是,Android浏览器似乎没有加载带有查询字符串的URL.有没有办法在System.Web.Optimization中自定义此字符串?


编辑:

我的问题得到解答,我试图检测用户代理字符串上的android,并用一个查询字符串替换样式表.显然,我有问题,是不是因为查询字符串,它是精缩是造成它不能完全加载样式表在Android股票浏览器中的web字体的CSS版本.

Android股票浏览器无法加载带有转义反斜杠的css内容字符串,这是ASP.NET缩小器的一种解决方法,它会错误地缩小相同的css内容字符串.我最终将图标字体css样式放在它自己的"手工缩小"样式表上.

asp.net-mvc asp.net-optimization system.web.optimization

6
推荐指数
2
解决办法
2381
查看次数

在调试时如何缓存单个渲染文件?

目前,开发人员不可能轻松地一起工作.虽然关闭了调试缩小和捆绑,但缓存破坏者也是如此.这导致每个触发javascript的开发者必须打开每个javascript文件并强制刷新以确保它们不会丢失更改.

我找到了一些我认为可能有用的参考文献,但是没有一个实现已经解决了.

第一种是通过一个变换器将变换器应用于各个Bundles IBundleTransform.

Public Class DebugCacheBuster
    Implements IBundleTransform

    Public Sub Process(context As BundleContext, response As BundleResponse) Implements IBundleTransform.Process
        If BundleTable.EnableOptimizations Then
            Exit Sub
        End If

        For Each file As BundleFile In response.Files
            file.IncludedVirtualPath &= GetPathHash(HostingEnvironment.MapPath(file.IncludedVirtualPath))
        Next
    End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

这看起来很有希望,但我无法让它发挥作用.我尝试将这个类的新实例添加到每个bundle的构造函数中,并且我还尝试在创建它们之后循环遍历所有bundle.我的突破点被击中并且IncludedVirtualPath似乎已经更新.继续渲染后,路径不会更新.

我还尝试创建自定义VirtualPathProvider和自定义VirtualFile并覆盖VirtualPath以返回正确的值,但再次,当它呈现时,路径是裸的.

我是否对变换做错了什么?还有其他方法可以实现吗?

system.web.optimization

6
推荐指数
1
解决办法
75
查看次数

Asp.Net MVC 4捆绑中的JavaScript错误

当我在MVC 4中使用下面的Bundling时,我的应用程序会出现几个JavaScript错误,例如'jQuery undefined'

        bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-{version}.js",
                    "~/Scripts/jquery-ui-{version}.js",
                    "~/Scripts/jquery.unobtrusive*",
                    "~/Scripts/jquery.validate*"));
Run Code Online (Sandbox Code Playgroud)

但是,当我使用以下方法时,我的应用程序无需JavaScript错误:

        bundles.Add(new ScriptBundle("~/bundles/jquery1").Include(
                    "~/Scripts/jquery-{version}.js"));

        bundles.Add(new ScriptBundle("~/bundles/jquery2").Include(
                    "~/Scripts/jquery-ui-{version}.js"));

        bundles.Add(new ScriptBundle("~/bundles/jquery3").Include(
                    "~/Scripts/jquery.unobtrusive*"));

        bundles.Add(new ScriptBundle("~/bundles/jquery3").Include(
                    "~/Scripts/jquery.validate*"));
Run Code Online (Sandbox Code Playgroud)

我的问题:问题是什么?

asp.net asp.net-mvc asp.net-mvc-4 bundling-and-minification system.web.optimization

5
推荐指数
1
解决办法
4385
查看次数

asp.net Webforms 捆绑和缩小 - 捆绑脚本抛出 404

我一直在尝试为我现有的 asp.net webforms 项目实现捆绑和缩小,不幸的是它最终得到了 404 响应。

首先让我分享一下我遵循的步骤。

  1. System.Web.Optimization通过nuget安装。

  2. 添加BundleConfig类并在 Glabal.asax Application_Start 事件上注册它

我的代码用于捆绑 JS 文件。

public static void RegisterBundles(BundleCollection bundles)
{
    bundles.Add(new ScriptBundle("~/bundles/modelJs").Include( 
    "~/src/model.js", 
    "~/src/calender.js", 
    "~/src/common.js", 
    "~/src/insurance.js")); 
Run Code Online (Sandbox Code Playgroud)

...

  1. 向 aspx 页面添加以下标记
 <asp:PlaceHolder runat="server"> 
    <%: System.Web.Optimization.Scripts.Render("~/bundles/modelJs") %> 
    </asp:PlaceHolder>
Run Code Online (Sandbox Code Playgroud)
  1. 设置 BundleTable.EnableOptimizations = true; 在bundleConfig中,形成的url是

http://localhost:9011/bundles/modelJs/?v=xNmmFhbzC1isUARLQne-XoBRkWBWApbnRQX8AGvNxQY1

我还检查了 VS2013 Webforms 应用程序中添加的示例项目,令人惊讶的是,它似乎工作正常。

我在 SO 上看到了很多类似问题的问题,但无法解决。

c# asp.net webforms bundling-and-minification system.web.optimization

5
推荐指数
1
解决办法
2397
查看次数