zoukankan      html  css  js  c++  java
  • mvc基础系列说谈(10)——修饰标签(修饰属性,过滤器)(下)

    1)先引用百度知道中的几段话:

    GZIP最早由Jean-loup GaillyMark Adler创建,用于UNIX系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。现今已经成为Internet 上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。

    ……

    IIS启用gzip

    现代的浏览器IE6Firefox都支持客户端Gzip,也就是说,在服务器上的网页,传输之前,先使用Gzip压缩再传输给客户端,客户端接收之后由浏览器解压显示,这样虽然稍微占用了一些服务器和客户端的CPU,但是换来的是更高的带宽利用率。对于纯文本来讲,压缩率是相当可观的。如果每个用户节约50%的带宽,那么你租用来的那点带宽就可以服务多一倍的客户了。

    IIS6已经内建了Gzip压缩的支持,可惜,没有设置更好的管理界面。所以要打开这个选项,还要费些功夫。

    首先,如果你需要压缩静态文件(HTML),需要在硬盘上建一个目录,并给它“IUSR_机器名这个用户的写权限。如果压缩动态文件(PHPaspaspx)就不需要了,因为它的页面是每次都动态生成的,压缩完就放弃。然后在IIS管理器中,网站上面右键-属性,不是下面的某个站点,而是整个网站。进入服务标签,选上启用动态内容压缩,静态内容压缩。

    然后选中网站下面那个服务器扩展,新建一个服务器扩展。名字无所谓,下面的添加文件的路径是:

      c:\windows\system32\inetsrv\gzip.dll,然后启用这个扩展。

    这时候静态内容是可以压缩的,但是对于动态内容,aspx文件却不在压缩范围内。因为默认的可压缩文件并没有这个扩展名。而管理界面中你又找不到可以增加扩展名的地方,这时候只能去修改它的配置文件了。

    c:\windows\system32\inetsrv\下面有个MetaBase.xml文件,可以用记事本打开,找到IIsCompressionScheme,有三个相同名字的段,分别是deflate,gzip,Parameters,第三段不用管它,前两段有基本相同的参数,在这两段的参数HcScriptFileExtensions下面都加上一行aspx,如果你有其它的动态程序要压缩,也加在这里。HcDynamicCompressionLevel改成9,(0109是性价比最高的一个)。

     

    2)再来一些Http头的一些信息

    ……

    HTTP 请求和 HTTP 响应都使用头发送有关 HTTP 消息的信息。头由一系列行组成,每行都包含名称,然后依次是冒号、空格、值。字段可按任何顺序排列。某些头字段既能用于请求头也能用于响应头,而另一些头字段只能用于其中之一。

    许多请求头字段都允许客户端在值部分指定多个可接受的选项,有时甚至可以对这些选项的首选项进行排名。多个项以逗号分隔。例如,客户端可以发送包含 “Content-Encoding: gzip, compress,”的请求头,表示可以接受各种压缩类型。如果服务器的响应正文使用 gzip 编码,其响应头中将包含“Content-Encoding: gzip”

    ……

     

    准备工作:

    System.IO.Compression名字空间

    它包含提供基本的流压缩和解压缩服务的类。有两个类:

    DeflateStream  提供用于使用 Deflate 算法压缩和解压缩流的方法和属性。

    GZipStream  提供用于压缩和解压缩流的方法和属性。

     

    现在实现压缩过滤器

    public override void OnActionExecuting(FilterExecutingContext 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);
        }
    }

     

    说明:

    ·HttpRequestBase这个类是3.5中的,在2.0中,没有。

    ·string acceptEncoding = request.Headers["Accept-Encoding"];

    这句用来获取请求Http头中的Accept-Encoding键值。

    ·if (string.IsNullOrEmpty(acceptEncoding)) return;

    这句判断,如果为空或为无时,返回。(在上篇中的图片防盗中,也返回了。当处理无果时,返回)

     

    测试

    请求一个地址,这个视图内容有2css文件,1gif图片。

    在不进行压缩时

    (Count=4, 发送=1.86 K, 接收内容=3.19 K, 持续时间 =  0.048 s)

    其中html请求时:

    Text/html:2054字节 

     

    在进行压缩后

    (Count=4, 发送=1.86 K, 接收内容=2.01 K, 持续时间 =  0.094 s)

    Text/html:2057字节,gzip已经压缩到848字节(压缩率为58.77%)

     

  • 相关阅读:
    51nod 1087 1 10 100 1000(找规律+递推+stl)
    51nod 1082 与7无关的数 (打表预处理)
    51 nod 1080 两个数的平方和
    1015 水仙花数(水题)
    51 nod 1003 阶乘后面0的数量
    51nod 1002 数塔取数问题
    51 nod 1001 数组中和等于K的数对
    51 nod 1081 子段求和
    51nod 1134 最长递增子序列 (O(nlogn)算法)
    51nod 1174 区间中最大的数(RMQ)
  • 原文地址:https://www.cnblogs.com/jams742003/p/1671777.html
Copyright © 2011-2022 走看看