加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

ASP.NET Core中的相应压缩的实现

发布时间:2020-08-21 12:17:23 所属栏目:编程 来源:网络整理
导读:这篇文章首要先容了ASP.NET Core中的相应压缩的实现,文中通过示例代码先容的很是具体,对各人的进修可能事变具有必然的参考进修代价,必要的伴侣们下面跟着小编

public class GzipCompressionProvider : ICompressionProvider { public GzipCompressionProvider(IOptions<GzipCompressionProviderOptions> options) { Options = options.Value; } private GzipCompressionProviderOptions Options { get; } // 对应的Encoding名称 public string EncodingName { get; } = "gzip"; public bool SupportsFlush => true; // 焦点代码就是这句 将原始的输出流转换为压缩的GZipStream // 我们配置的Level压缩级别将抉择压缩的机能和质量 public Stream CreateStream(Stream outputStream) => new GZipStream(outputStream, Options.Level, leaveOpen: true); }

关于ResponseCompressionProvider其他相干的要领咱们在讲授UseResponseCompression中间件的时辰在详细看用到的要领,由于这个类是相应压缩的焦点类,此刻提前说了,到中间件行使的处所也许会健忘了。接下来我们就看UseResponseCompression的大抵实现。

UseResponseCompression#

UseResponseCompression详细也就一个无参的扩展要领,也较量简朴,由于设置和事变都由注入的处所完成了,以是我们直接查察中间件里的实现,找到中间件位置ResponseCompressionMiddleware[点击查察源码👈]

public class ResponseCompressionMiddleware { private readonly RequestDelegate _next; private readonly IResponseCompressionProvider _provider; public ResponseCompressionMiddleware(RequestDelegate next, IResponseCompressionProvider provider) { _next = next; _provider = provider; } public async Task Invoke(HttpContext context) { //判定是否包括Accept-Encoding头信息,不包括直接大叫一声"抬走下一个" if (!_provider.CheckRequestAcceptsCompression(context)) { await _next(context); return; } //获取原始输出Body var originalBodyFeature = context.Features.Get<IHttpResponseBodyFeature>(); var originalCompressionFeature = context.Features.Get<IHttpsCompressionFeature>(); //初始化相应压缩Body var compressionBody = new ResponseCompressionBody(context, _provider, originalBodyFeature); //配置成压缩Body context.Features.Set<IHttpResponseBodyFeature>(compressionBody); context.Features.Set<IHttpsCompressionFeature>(compressionBody); try { await _next(context); await compressionBody.FinishCompressionAsync(); } finally { //恢复兴始Body context.Features.Set(originalBodyFeature); context.Features.Set(originalCompressionFeature); } } }

这此中间件很是的简朴,就是初始化了ResponseCompressionBody。看到这里你大概会好奇,并没有触发挪用压缩相干的任何代码,ResponseCompressionBody壹贝偾挪用了FinishCompressionAsync都是和开释相干的,不要着急我们来看ResponseCompressionBody类的布局

internal class ResponseCompressionBody : Stream, IHttpResponseBodyFeature, IHttpsCompressionFeature { }

这个类实现了IHttpResponseBodyFeature,我们行使的Response.Body着实就是获取的HttpResponseBodyFeature.Stream属性。我们行使的Response.WriteAsync相干的要领,着实内部都是在挪用PipeWriter举办写操纵,而PipeWriter就是来自HttpResponseBodyFeature.Writer属性。可以大抵归纳综合为,输出相干的操纵其焦点都是在操纵IHttpResponseBodyFeature。有乐趣的可以自行查阅HttpResponse相干的源码可以相知趣关信息。以是我们的ResponseCompressionBody着实是重写了输出操纵相干要领。也就是说,只要你挪用了Response相干的Write或Body相干的,其收??都是在操纵IHttpResponseBodyFeature,因为我们开启了相应输出相干的中间件,以是会挪用IHttpResponseBodyFeature的实现类ResponseCompressionBody相干的要领完成输出。和我们通例领略的照旧有毛病的,一样平常环境下我们以为,着实只要针对输出的Stream做操纵就可以了,可是相应压缩中间件竟然重写了输出相干的操纵。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读