我试图通过合并和压缩CSS和JS文件来优化网站性能.我的问题更多的是关于如何实现这一目标的(具体)步骤,考虑到我所面临的真实情况(尽管如此,应该是其他开发人员中的典型情况).
我的页面引用了几个CSS和JS文件,如下所示:
<!--
It's easier to work on smaller files during development.
Hence, the multiple CSS and JS files.
-->
<link type="text/css" rel="stylesheet" href="/css/main.css" />
<link type="text/css" rel="stylesheet" href="/css/secondary-1.css" />
<link type="text/css" rel="stylesheet" href="/css/secondary-2.css" />
<script type="text/javascript" src="/scripts/js/main.js"></script>
<script type="text/javascript" src="/scripts/js/adapter/adapter.js"></script>
<script type="text/javascript" src="/scripts/js/adapter/title-adapter.js"></script>
Run Code Online (Sandbox Code Playgroud)
对于生产版本,我想将3个CSS文件合并为一个并使用例如YUI Compressor缩小它.但是,我需要更新所有需要这3个文件的页面来引用新近缩小的CSS.这似乎容易出错(例如,您正在删除并在许多文件中添加一些行).还有其他风险较小的方法吗?JS文件也存在同样的问题.
当请求具有Gzip压缩的页面时,我收到了很多以下错误:
System.IO.InvalidDataException:GZip页脚中的CRC与从解压缩数据计算的CRC不匹配
我正在使用本机GZipStream进行解压缩,正在寻找解决此问题的方法.考虑到这一点,是否有解决这个或另一个GZip库(免费?)的工作,它将正确处理这个问题?
我正在验证webResponse ContentEncoding是否为GZIP
更新5/11 简化的snippit
//Caller
public void SOSampleGet(string url)
{
// Initialize the WebRequest.
webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Method = WebRequestMethods.Http.Get;
webRequest.KeepAlive = true;
webRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
webRequest.Headers.Add("Accept-Encoding", "gzip,deflate");
webRequest.Referer = WebUtil.GetDomain(url);
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
using (Stream stream = GetStreamForResponse(webResponse, READTIMEOUT_CONST))
{
//use stream
}
}
//Method
private static Stream GetStreamForResponse(HttpWebResponse webResponse, int readTimeOut)
{
Stream stream;
switch (webResponse.ContentEncoding.ToUpperInvariant())
{
case "GZIP":
stream = new GZipStream(webResponse.GetResponseStream(), CompressionMode.Decompress);
break;
case "DEFLATE":
stream = new DeflateStream(webResponse.GetResponseStream(), CompressionMode.Decompress);
break;
default: …Run Code Online (Sandbox Code Playgroud) 我一直尝试在我的Windows Azure托管的WCF Restful服务上启用gzip HTTP压缩失败,该服务仅从GET和POST请求返回JSON.
我已经尝试了很多东西,我很难列出所有这些东西,我现在意识到我一直在处理相互矛盾的信息(关于旧版本的天蓝色等),所以最好从干净的石板开始吧!
我正在使用Visual Studio 2008,使用2010年2月的Visual Studio工具.
所以,根据以下链接 ..
..现在已启用HTTP压缩.我已经使用了以下页面中的建议(仅限URL压缩建议).
http://blog.smarx.com/posts/iis-compression-in-windows-azure
<urlCompression doStaticCompression="true"
doDynamicCompression="true"
dynamicCompressionBeforeCache="true"
/>
Run Code Online (Sandbox Code Playgroud)
..但我没有压缩.我不知道urlCompression和httpCompression之间的区别是没有用的.我试图找出但无济于事!
可能,Visual Studio的工具是在支持压缩的Azure版本之前发布的,这是一个问题吗?我已经阅读过某些地方,使用最新的工具,您可以选择在发布时使用哪个版本的Azure OS ...但我不知道这是否属实,如果是,我找不到哪里选择.我可以使用预启用http的版本吗?
我也试过了吹嘘的http压缩模块,但没有结果.
有没有人有关于如何实现这一目标的最新建议?即与当前版本的Azure OS相关的建议.
干杯!
史蒂芬
更新:我编辑了上面的代码来修复web.config片段中的类型.
更新2:测试使用下面的答案显示的URL whatsmyip的答复是表示在没有经过任何压缩正在返回从我service.svc我的JSON响应,但静态的HTML页面ARE被用gzip压缩返回.任何关于如何获得压缩的JSON响应的建议都将非常感谢!
更新3:尝试了大于256KB的JSON响应,以查看问题是否是由于JSON响应小于此,如下面的评论中所述.不幸的是,响应仍然没有被压缩.
我很难让IIS 7正确压缩来自ASP.NET MVC的Json结果.我在IIS中启用了静态和动态压缩.我可以向Fiddler验证正常的text/html和类似的记录是否被压缩.查看请求时,会出现accept-encoding gzip标头.响应具有mimetype"application/json",但未压缩.
我发现问题似乎与MimeType有关.当我包含时mimeType="*/*",我可以看到响应是正确的gzip压缩.如何在不使用通配符mimeType的情况下使用IIS进行压缩?我假设这个问题与ASP.NET MVC生成内容类型头的方式有关.
CPU使用率远低于动态限制阈值.当我从IIS检查跟踪日志时,我可以看到它由于找不到匹配的mime类型而无法压缩.
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" noCompressionForProxies="false">
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
<dynamicTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/x-javascript" enabled="true" />
<add mimeType="application/json" enabled="true" />
</dynamicTypes>
<staticTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/x-javascript" enabled="true" />
<add mimeType="application/atom+xml" enabled="true" />
<add mimeType="application/xaml+xml" enabled="true" />
<add mimeType="application/json" enabled="true" />
</staticTypes>
</httpCompression>
Run Code Online (Sandbox Code Playgroud) 我听说过很多人应该将gZip用于他们的网页,以便更快地访问和下载,并且还可以节省带宽.
那么这个gZip压缩是什么?它如何使下载速度更快?它是压缩HTML和图像还是仅压缩HTML.
如果我要在我的webapps中开始使用gZip,我需要考虑哪些因素?是否有任何服务器或浏览器限制,或它是否仅支持特定编码.
我刚刚搜索了gzip和Deflate,发现Deflate更好.
但是,当我检查Google,Facebook和StackExchange的响应标题时,他们都在使用GZIP.为什么他们使用gzip而不是Deflate?
我有一个MVC应用程序视图,生成相当大的HTML值表(> 20MB).
我正在使用压缩过滤器压缩控制器中的视图
internal class CompressFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpRequestBase request = filterContext.HttpContext.Request;
string acceptEncoding = request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding))
return;
acceptEncoding = acceptEncoding.ToUpperInvariant();
HttpResponseBase response = filterContext.HttpContext.Response;
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在运行压缩过滤器之前消除视图中生成的(非常大)冗余空白量(以减少压缩工作量和大小)?
编辑: 我使用下面的Womp建议的WhiteSpaceFilter技术.
感兴趣的是Firebug分析的结果:
1)没有压缩,没有空白条 - 21MB,2.59分钟
2)使用GZIP压缩,没有空白条 - 2MB,17.59s
3)使用GZIP压缩,空白条--558kB,12.77s
所以当然值得.
每个人,就我而言,这个问题都是在EDIT 2中进行的.尽管这只是问题的IIS方面的部分解决方案,但这正是我所寻求的.
因此,我将把我的问题添加到有关该主题的小问题上.
我正在尝试对来自WCF服务的大型soap响应启用GZip压缩.到目前为止,我已经按照这里和其他各种地方的说明在IIS上启用动态压缩.这是applicationHost.config中的dynamicTypes部分:
<dynamicTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/x-javascript" enabled="true" />
<add mimeType="application/atom+xml" enabled="true" />
<add mimeType="application/xaml+xml" enabled="true" />
<add mimeType="application/xop+xml" enabled="true" />
<add mimeType="application/soap+xml" enabled="true" />
<add mimeType="*/*" enabled="false" />
</dynamicTypes>
Run Code Online (Sandbox Code Playgroud)
并且:
<urlCompression doDynamicCompression="true" doStaticCompression="true" />
Run Code Online (Sandbox Code Playgroud)
虽然我不清楚为什么需要这样做.
为了以防万一,在那里扔了一些额外的哑剧类型.我已经实现了IClientMessageInspector来添加Accept-Encoding:gzip,deflate到我的客户端的HttpRequests.这是一个从fiddler获取的请求标头的示例:
POST http://[omitted]/TestMtomService/TextService.svc HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Accept-Encoding: gzip, deflate
Host: [omitted]
Content-Length: 542
Expect: 100-continue
Run Code Online (Sandbox Code Playgroud)
现在,这不起作用.无论消息大小如何(尝试高达1.5Mb),都不会发生压缩.我看过这篇文章,但没有像他描述的那样遇到异常,所以我没有尝试过他提出的CodeProject实现.此外,我已经看到许多其他实现应该让它工作,但无法理解它们(例如,msdn的GZip编码器).为什么我需要实现编码器或代码项目解决方案?IIS不应该负责压缩吗?
那么我需要做些什么才能让它发挥作用?
乔尼
编辑:我认为WCF绑定可能值得发布,但我不确定它们是否相关(这些是来自客户端):
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WsTextBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" …Run Code Online (Sandbox Code Playgroud) 所以我试图让我的应用程序使用动态压缩和gzip发送其JSON响应.不幸的是,这不起作用.服务器上的所有静态压缩都运行正常,但不是动态的.
我通过添加以下内容来设置:
<add mimeType="application/json" enabled="true" />
<add mimeType="application/json; charset=utf-8" enabled="true" />
Run Code Online (Sandbox Code Playgroud)
到applicationHost.config文件中的<dynamicTypes>部分<httpCompression>.我正在使用Charles检查HTTP请求,我可以验证我是否使用Accept-Encoding: gzip, deflate标头集发送请求.我已经试过这两个Accept: */*和Accept: application/json.当它不工作时,我启用了"失败请求"跟踪日志记录来查找错误代码DYNAMIC_COMPRESSION_NOT_SUCCESS,这是NO_MATCHING_CONTENT_TYPE.
我一直在尝试研究论坛和谷歌,但我所能看到的是人们说使用指定的字符集的mimeType修复了他们的问题,但在我的情况下,它仍然无法正常工作,我可以验证响应来了回头说头 Content-Type: application/json; charset=utf-8
为JSON响应提供服务的端点是[ScriptService()]在类和[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]方法上注释的标准.NET ASMX WebServices .他们返回JSON很好,但我不能让动态压缩为我的生活工作.
由于这些是常规的Web方法,我还添加了:
<add mimeType="text/xml" enabled="true" />
<add mimeType="text/xml; charset=utf-8" enabled="true" />
Run Code Online (Sandbox Code Playgroud)
尝试gzip XML响应.令人沮丧的是,这种压缩在从同一方法发送JSON时不起作用.在这一点上,我很茫然.
Node上是否有SDCH (HTTP上的共享字典压缩)库?(或者其他任何实现?)
在npm上快速搜索没有产生任何结果.
http-compression ×10
gzip ×4
iis-7 ×3
json ×3
.net ×2
asp.net-mvc ×2
html ×2
asp.net ×1
azure ×1
browser ×1
c# ×1
compression ×1
css ×1
deflate ×1
javascript ×1
node.js ×1
optimization ×1
performance ×1
stream ×1
wcf ×1
whitespace ×1