搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > ASPNETCore > Nopcommerce 4.0性能优化扩展系列(四)-降低传输带宽类-启用删除页面空格中间件

Nopcommerce 4.0性能优化扩展系列(四)-降低传输带宽类-启用删除页面空格中间件

ASPNETCore 2017-11-29

Nopcommerce 4.0有很多可以优化性能的地方,今天先来一篇删除掉网页内容中不必要的空格。

一、自己扩展一个除掉网页中空格的中间件,代码和注释如下:

namespace Nop.Framework.Middleware.HtmlMinification

{


    /// <summary>

    /// </summary>

    public class HtmlMinificationMiddleware

    {

        private RequestDelegate _next;

        public HtmlMinificationMiddleware(RequestDelegate next)

        {

            if (next == null)

            {

                throw new ArgumentNullException(nameof(next));

            }

            _next = next;

        }

        public async Task Invoke(HttpContext context)

        {

            //获取响应体的引用

            var originalBody = context.Response.Body;

            try

            {

                //因为响应体实例是只读的,需要创建一个内存流实例,用来获取响应流内容

                using (var memStream = new MemoryStream())

                {

                    //把内存流的引用设置到Response.Body,假装是真的响应体接收数据

                    context.Response.Body = memStream;

                    //然后执行下一个中间件,等待有响应返回

                    await _next(context);

                    //需要判断响应是否正确,总不能把不正确的内容缓存起来吧

                    if (context.Response.StatusCode == (int)HttpStatusCode.OK)

                    {

                        

                        //把内存流的当前操作位置设为0,因为响应写入的过程中位置会在末尾。

                        memStream.Position = 0;

                        //读取内存流的内容,转换为字符串

                        var responseBody = new StreamReader(memStream).ReadToEnd();

                        //把字符串写入文件,这里还稍微压缩了一下

                        responseBody= Regex.Replace(responseBody, "\\n+\\s+", string.Empty);

                        responseBody = Regex.Replace(responseBody, "\\r+\\s+", string.Empty);

                        //在此把内存流的当前操作位置设为0

                        memStream.Position = 0;


                        using (var memoryStream = new MemoryStream())

                        {

                            var bytes = Encoding.UTF8.GetBytes(responseBody);

                            memoryStream.Write(bytes, 0, bytes.Length);

                            memoryStream.Seek(0, SeekOrigin.Begin);

                            //还需要把流复制到之前引用的响应体实例

                            await memoryStream.CopyToAsync(originalBody, bytes.Length);

                        }

                       


                     

                    }

                }

            }

            finally

            {

                //把响应体实例引用重新设置到响应体

                context.Response.Body = originalBody;

            }




        }

    }

}


二、启动除掉网页中空格的中间件

要在Nopcommerce 4.0中启用此中间件,需要修改两处地方,文件位置如下图:

需修改的文件和内容如下图:

Nopcommerce 4.0性能优化扩展系列(四)-降低传输带宽类-启用删除页面空格中间件


三、看看效果

很难看是不是,这段代码,除了机器人和你、我,没谁会看到这里。用户体验快就可以了。

四、可以继续优化的地方

缺点:每一次都要压缩,访问量大的话,服务器负担增大。

措施:结合nopcommerce的缓存机制+redis,可以做到内容不变时只压缩一次。具体怎么实现,等有需要时再写。








版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《Nopcommerce 4.0性能优化扩展系列(四)-降低传输带宽类-启用删除页面空格中间件》的版权归原作者「ASPNETCore」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读