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

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

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

相应压缩技能是今朝Web开拓规模中较量常用的技能,在带宽资源受限的环境下,行使压缩技能是晋升带宽负载的首选方案。我们认识的Web处事器,好比IIS、Tomcat、Nginx、Apache等都可以行使压缩技能,常用的压缩范例包罗Brotli、Gzip、Deflate,它们对CSS、JavaScript、HTML、XML 和 JSON等范例的结果照旧较量明明的,可是也存在必然的限定对付图片结果也许没那么好,由于图片自己就是压缩名目。其次,对付小于约莫150-1000 字节的文件(详细取决于文件的内容和压缩的服从,压缩小文件的开销也许会发生比未压缩文件更大的压缩文件。在ASP.NET Core中我们可以行使很是简朴的方法来行使相应压缩。

行使方法#

在ASP.NET Core中行使相应压缩的方法较量简朴。起首,在ConfigureServices中添加services.AddResponseCompression注入相应压缩相干的配置,好比行使的压缩范例、压缩级别、压缩方针类械寥。其次,在Configure添加app.UseResponseCompression拦截哀求判定是否必要压缩,大抵行使方法如下

public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddResponseCompression(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseResponseCompression(); } }

假如必要自界说一些设置的话还可以手动配置压缩相干

public void ConfigureServices(IServiceCollection services) { services.AddResponseCompression(options => { //可以添加多种压缩范例,措施会按照级别自动获取最优方法 options.Providers.Add<BrotliCompressionProvider>(); options.Providers.Add<GzipCompressionProvider>(); //添加自界说压缩计策 options.Providers.Add<MyCompressionProvider>(); //针对指定的MimeType来行使压缩计策 options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat( new[] { "application/json" }); }); //针对差异的压缩范例,配置对应的压缩级别 services.Configure<GzipCompressionProviderOptions>(options => { //行使最快的方法举办压缩,单不必然是压缩结果最好的方法 options.Level = CompressionLevel.Fastest; //不举办压缩操纵 //options.Level = CompressionLevel.NoCompression; //纵然必要淹灭很长的时刻,也要行使压缩结果最好的方法 //options.Level = CompressionLevel.Optimal; }); }

关于相应压缩大抵的事变方法就是,当提倡Http哀求的时辰在Request Header中添加Accept-Encoding:gzip可能其他你想要的压缩范例,可以转达多个范例。处事端吸取到哀求获取Accept-Encoding判定是否支持该种范例的压缩方法,假如支持则压缩输出内容相干而且配置Content-Encoding为当前行使的压缩方法一路返回。客户端获得相应之后获取Content-Encoding判定处事端是否回收了压缩技能,并按照对应的值判定行使了哪种压缩范例,然后行使对应的解压算法获得原始数据。

源码探讨#

通过上面的先容,信托各人对ResponseCompression有了必然的相识,接下来我们通过查察源码的方法相识一下它大抵的事变道理。

AddResponseCompression#

起首我们来查察注入相干的代码,详细代码承载在ResponseCompressionServicesExtensions扩展类中[点击查察源码👈]

public static class ResponseCompressionServicesExtensions { public static IServiceCollection AddResponseCompression(this IServiceCollection services) { services.TryAddSingleton<IResponseCompressionProvider, ResponseCompressionProvider>(); return services; } public static IServiceCollection AddResponseCompression(this IServiceCollection services, Action<ResponseCompressionOptions> configureOptions) { services.Configure(configureOptions); services.TryAddSingleton<IResponseCompressionProvider, ResponseCompressionProvider>(); return services; } }

首要就是注入ResponseCompressionProvider和ResponseCompressionOptions,起首我们来看关于ResponseCompressionOptions[点击查察源码👈]

public class ResponseCompressionOptions { // 配置必要压缩的范例 public IEnumerable<string> MimeTypes { get; set; } // 配置不必要压缩的范例 public IEnumerable<string> ExcludedMimeTypes { get; set; } // 是否开启https支持 public bool EnableForHttps { get; set; } = false; // 压缩范例荟萃 public CompressionProviderCollection Providers { get; } = new CompressionProviderCollection(); }

关于这个类就不做过多先容了,较量简朴。ResponseCompressionProvider是我们提供相应压缩算法的焦点类,详细怎样自动选用压缩算法都是由它提供的。这个类中的代码较量多,我们就不逐个要领讲授了,详细源码可自行查阅[点击查察源码👈],起首我们先看ResponseCompressionProvider的结构函数

public ResponseCompressionProvider(IServiceProvider services, IOptions<ResponseCompressionOptions> options) { var responseCompressionOptions = options.Value; _providers = responseCompressionOptions.Providers.ToArray(); //假如没有配置压缩范例默认回收Br和Gzip压缩算法 if (_providers.Length == 0) { _providers = new ICompressionProvider[] { new CompressionProviderFactory(typeof(BrotliCompressionProvider)), new CompressionProviderFactory(typeof(GzipCompressionProvider)), }; } //按照CompressionProviderFactory建设对应的压缩算法Provider好比GzipCompressionProvider for (var i = 0; i < _providers.Length; i++) { var factory = _providers[i] as CompressionProviderFactory; if (factory != null) { _providers[i] = factory.CreateInstance(services); } } //配置默认的压缩方针范例默以为text/plain、text/css、text/html、application/javascript、application/xml //text/xml、application/json、text/json、application/was var mimeTypes = responseCompressionOptions.MimeTypes; if (mimeTypes == null || !mimeTypes.Any()) { mimeTypes = ResponseCompressionDefaults.MimeTypes; } //将默认MimeType放入HashSet _mimeTypes = new HashSet<string>(mimeTypes, StringComparer.OrdinalIgnoreCase); _excludedMimeTypes = new HashSet<string>( responseCompressionOptions.ExcludedMimeTypes ?? Enumerable.Empty<string>(), StringComparer.OrdinalIgnoreCase ); _enableForHttps = responseCompressionOptions.EnableForHttps; }

(编辑:河北网)

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

热点阅读