我正在使用新的System.Web.Optimization,并创建了一个如下所示的包:
bundles.Add(New ScriptBundle("~/bundles/BaseJS").Include(
"~/Resources/Core/Javascripts/jquery-1.7.1.js",
"~/Resources/Core/Javascripts/jquery-ui-1.8.16.js",
"~/Resources/Core/Javascripts/jquery.validate.js",
"~/Resources/Core/Javascripts/jquery.validate.unobtrusive.js",
"~/Resources/Core/Javascripts/jquery.unobtrusive-ajax.js"))在我看来,我添加了这个
@System.Web.Optimization.Scripts.Render("~/bundles/BaseJS")在fiddler中,URL的过期标头为1年,内容类型为text/javascript
在web.config中,我有一些处理静态JS文件的gzip代码,但它似乎不适用于精简包。
<staticContent>
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00"/>
<remove fileExtension=".js"/>
<mimeMap fileExtension=".js" mimeType="text/javascript"/>
</staticContent>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
<dynamicTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="text/javascript" enabled="true"/>
</dynamicTypes>
<staticTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="text/javascript" enabled="true"/>
</staticTypes>
</httpCompression>有没有办法让渲染包gzip内容?
发布于 2012-07-06 06:58:18
正如您所提到的,通过创建实现IBundleTransform的类来创建自定义包转换是正确的方法。例如,下面是一个使用SharpZipLib (via NuGet)进行GZip压缩的捆绑变换示例:
public class GZipTransform : IBundleTransform
{
string _contentType;
public GZipTransform(string contentType)
{
_contentType = contentType;
}
public void Process(BundleContext context, BundleResponse response)
{
var contentBytes = new UTF8Encoding().GetBytes(response.Content);
var outputStream = new MemoryStream();
var gzipOutputStream = new GZipOutputStream(outputStream);
gzipOutputStream.Write(contentBytes, 0, contentBytes.Length);
var outputBytes = outputStream.GetBuffer();
response.Content = Convert.ToBase64String(outputBytes);
// NOTE: this part is broken
context.HttpContext.Response.Headers["Content-Encoding"] = "gzip";
response.ContentType = _contentType ;
}
}现在,不幸的是-在测试这个样本时,我发现了一个使其无法工作的bug。最初的设计期望人们做非常简单的事情-因此,BundleResponse公开了允许您设置内容(更具体地说,字符串内容)和内容类型的属性。BundleContext公开了HttpContext的一个属性,这会让一个合理的人相信可以在那里设置响应的其他属性(如上所示)。然而,这具有误导性,原因有两个:
我们将仔细研究下一版框架中的设计,以使您能够指定HTTP响应消息的所有(理想情况下)方面,这些方面与HTTP上下文无关(这意味着它很容易缓存)。
一个额外的注解。要提供自定义bundle转换,您需要后退到创建Bundle的实例,而不是ScriptBundle/StyleBundle。这些类实际上只是带有预先配置的bundle转换的bundle的速记类型。要创建基于Bundle的包,您可以执行类似以下操作:
var jqueryBundle = new Bundle("~/bundles/jqueryall", new GZipTransform("text/javascript"));
jqueryBundle.Include("~/Scripts/jquery-1.*",
"~/Scripts/jquery-ui*",
"~/Scripts/jquery.unobtrusive*",
"~/Scripts/jquery.validate*");
bundles.Add(jqueryBundle);发布于 2014-03-31 18:51:53
在最新的ASP.NET Optimization (v1.1.2)中,GZipTransform类不能很好地工作。
我发现了一种自定义Bundle类的新方法,它总是在响应之前压缩包内容(被转换和缓存):
public class GZipBundle : Bundle
{
public GZipBundle(string virtualPath, params IBundleTransform[] transforms)
: base(virtualPath, null, transforms) { }
public override BundleResponse CacheLookup(BundleContext context)
{
if (null != context) GZipEncodePage(context.HttpContext);
return base.CacheLookup(context);
}
// Sets up the current page or handler to use GZip through a Response.Filter.
public static void GZipEncodePage(HttpContextBase httpContext)
{
if (null != httpContext && null != httpContext.Request && null != httpContext.Response
&& (null == httpContext.Response.Filter
|| !(httpContext.Response.Filter is GZipStream || httpContext.Response.Filter is DeflateStream)))
{
// Is GZip supported?
string acceptEncoding = httpContext.Request.Headers["Accept-Encoding"];
if (null != acceptEncoding
&& acceptEncoding.IndexOf(DecompressionMethods.GZip.ToString(), StringComparison.OrdinalIgnoreCase) >= 0)
{
httpContext.Response.Filter = new GZipStream(httpContext.Response.Filter, CompressionMode.Compress);
httpContext.Response.AddHeader("Content-Encoding", DecompressionMethods.GZip.ToString().ToLowerInvariant());
}
else if (null != acceptEncoding
&& acceptEncoding.IndexOf(DecompressionMethods.Deflate.ToString(), StringComparison.OrdinalIgnoreCase) >= 0)
{
httpContext.Response.Filter = new DeflateStream(httpContext.Response.Filter, CompressionMode.Compress);
httpContext.Response.AddHeader("Content-Encoding", DecompressionMethods.Deflate.ToString().ToLowerInvariant());
}
// Allow proxy servers to cache encoded and unencoded versions separately
httpContext.Response.AppendHeader("Vary", "Content-Encoding");
}
}
}
// Represents a bundle that does CSS minification and GZip compression.
public sealed class GZipStyleBundle : GZipBundle
{
public GZipStyleBundle(string virtualPath, params IBundleTransform[] transforms) : base(virtualPath, transforms) { }
}
// Represents a bundle that does JS minification and GZip compression.
public sealed class GZipScriptBundle : GZipBundle
{
public GZipScriptBundle(string virtualPath, params IBundleTransform[] transforms)
: base(virtualPath, transforms)
{
base.ConcatenationToken = ";" + Environment.NewLine;
}
}然后,您可以使用GZipStyleBundle和GZipScriptBundle替换原始的Bundle类:StyleBundle、ScriptBundle。例如:
public static class BundleConfig
{
// For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkId=254725
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new GZipScriptBundle("~/bundles/jquery.js").Include(...));
bundles.Add(new GZipScriptBundle("~/bundles/jquery-ui.js", new JsMinify()).Include(...));
bundles.Add(new GZipStyleBundle("~/bundles/all.css", new CssMinify()).Include(...));
}
}问候
发布于 2012-08-05 07:49:05
它可以使用HttpModule来实现
public class GzipModule : IHttpModule
{
#region IHttpModule Members
public void Init(HttpApplication application)
{
application.BeginRequest += Application_BeginRequest;
}
public void Dispose()
{
}
#endregion
private void Application_BeginRequest(Object source, EventArgs e)
{
HttpContext context = HttpContext.Current;
HttpRequest request = context.Request;
HttpResponse response = context.Response;
string acceptEncoding = request.Headers["Accept-Encoding"];
if (String.IsNullOrEmpty(acceptEncoding))
return;
acceptEncoding = acceptEncoding.ToUpperInvariant();
if (acceptEncoding.Contains("GZIP"))
{
response.AppendHeader("Content-Encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
response.AppendHeader("Content-Encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
}
}并在config中注册它。
<system.webServer>
<modules>
<add name="Gzip" type="Gecko.Web.GzipModule" />
</modules>https://stackoverflow.com/questions/11300839
复制相似问题