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的缓存机制+redis,可以做到内容不变时只压缩一次。具体怎么实现,等有需要时再写。
版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《Nopcommerce 4.0性能优化扩展系列(四)-降低传输带宽类-启用删除页面空格中间件》的版权归原作者「ASPNETCore」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458
文章来源: 阅读原文
ASPNETCore微信公众号:ASPNETCore
手机扫描上方二维码即可关注ASPNETCore微信公众号