Pra*_*ant 80 c# compression asp.net gzip
我正在尝试为我的asp.net页面实现GZip压缩(包括我的CSS和JS文件).我尝试了以下代码,但它只压缩我的.aspx页面(从YSlow中找到它)
HttpContext context = HttpContext.Current;
context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
HttpContext.Current.Response.AppendHeader("Content-encoding", "gzip");
HttpContext.Current.Response.Cache.VaryByHeaders["Accept-encoding"] = true;
Run Code Online (Sandbox Code Playgroud)
上面的代码只压缩我的.aspx页面代码(标记)而不是CSS和JS文件,它们作为外部文件包含在内.请告诉我如何使用代码在ASP.NET中实现GZip压缩(因为我在共享主机服务器上,我无法访问IIS服务器配置).而且在上面的代码中,我没有得到最后两行,为什么使用它们以及这些行的目的是什么.请解释!
谢谢
dor*_*zur 45
这是css和javascript文件的解决方案
<httpCompression>
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
<dynamicTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="message/*" enabled="true"/>
<add mimeType="application/javascript" enabled="true"/>
<add mimeType="*/*" enabled="false"/>
</dynamicTypes>
<staticTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="message/*" enabled="true"/>
<add mimeType="application/javascript" enabled="true"/>
<add mimeType="*/*" enabled="false"/>
</staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>
Run Code Online (Sandbox Code Playgroud)
Ben*_*man 28
对于压缩JS和CSS文件,您实际上必须在IIS级别处理它,因为这些文件是在没有ASP.NET运行时的情况下直接呈现的.
你可以在IIS中创建一个JSX和CSSX扩展映射到aspnet_isapi.dll,然后利用你的邮政编码,但IIS可能会为你做得更好.
内容编码标头告诉浏览器它需要在呈现之前解压缩内容.根据内容的形状,有些浏览器足够聪明,无论如何都可以解决这个问题,但最好还是告诉它.
Accept-encoding缓存设置在那里,因此gzip压缩内容的缓存版本将不会发送到仅请求text/html的浏览器.
Nud*_*ena 14
这可能对你试用它很有用,它接受deflate和gzip压缩.
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
string acceptEncoding = app.Request.Headers["Accept-Encoding"];
Stream prevUncompressedStream = app.Response.Filter;
if (app.Context.CurrentHandler == null)
return;
if (!(app.Context.CurrentHandler is System.Web.UI.Page ||
app.Context.CurrentHandler.GetType().Name == "SyncSessionlessHandler") ||
app.Request["HTTP_X_MICROSOFTAJAX"] != null)
return;
if (acceptEncoding == null || acceptEncoding.Length == 0)
return;
acceptEncoding = acceptEncoding.ToLower();
if (acceptEncoding.Contains("deflate") || acceptEncoding == "*")
{
// deflate
app.Response.Filter = new DeflateStream(prevUncompressedStream,
CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "deflate");
}
else if (acceptEncoding.Contains("gzip"))
{
// gzip
app.Response.Filter = new GZipStream(prevUncompressedStream,
CompressionMode.Compress);
app.Response.AppendHeader("Content-Encoding", "gzip");
}
}
Run Code Online (Sandbox Code Playgroud)
int*_*ion 11
它只压缩你的ASPX文件的原因是你编写的代码只嵌入在ASPX文件中.ASPX文件是来自其包含的任何链接内容的单独请求.因此,如果您有一个包含以下内容的ASPX页面:
<img src="www.example.com\exampleimg.jpg" alt="example" />
Run Code Online (Sandbox Code Playgroud)
这相当于从浏览器到资源的2个请求(除了DNS查询):
每个请求都有自己的响应流.您发布的代码仅附加到ASPX响应流,这就是为什么只压缩您的ASPX页面.您发布的代码的第1行和第2行基本上接管了页面的正常响应流,并注入了一些"中间人"代码,在这种情况下,使用GZip流来处理和压缩正常输出流,然后将其发送到网络中.
第3和第4行正在设置响应标头.所有http请求和响应都具有在内容之前发送的标头.这些设置请求/响应,以便服务器和客户端知道发送的内容和方式.
在这种情况下,第3行通知客户端浏览器响应流是通过gzip压缩的,因此需要在显示之前由客户端浏览器解压缩.
第4行只是打开响应的Accept-Encoding标头.否则,这将不会出现在答复中.
您可以编写/获取可插入的模块,允许您压缩其他MIME类型的多个部分,例如*.js和*.css,但最好只使用IIS的内置压缩功能.
您还没有说过您正在使用的IIS版本,但如果它是IIS 7.0,则需要在<system.webserver>
web.config文件的部分中包含以下内容:
<httpCompression>
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
<staticTypes>
<add mimeType="text/*" enabled="true" />
</staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" />
Run Code Online (Sandbox Code Playgroud)
..
理查德
归档时间: |
|
查看次数: |
88916 次 |
最近记录: |