在Asp.Net WebApi中使用DotNetZip压缩响应流过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | using Ionic.Zlib; using System; using System.IO; using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using System.Web.Http.Filters; namespace WebAPI.Filters { /// <summary> /// 压缩返回信息 /// </summary> [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true , AllowMultiple = true )] public class CompressionFilter : ActionFilterAttribute { public override Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken) { if (actionExecutedContext.Response == null || actionExecutedContext.Request.Method == HttpMethod.Options) { return DefaultResult(actionExecutedContext, cancellationToken); } var content = actionExecutedContext.Response.Content; if (content == null ) { return DefaultResult(actionExecutedContext, cancellationToken); } var acceptEncoding = actionExecutedContext.Request.Headers.AcceptEncoding.Where(x => x.Value == "gzip" || x.Value == "deflate" ).ToList(); if (acceptEncoding.Count == 0) { return DefaultResult(actionExecutedContext, cancellationToken); } var bytes = content.ReadAsByteArrayAsync(); switch (acceptEncoding[0].Value) { case "gzip" : actionExecutedContext.Response.Content = new ByteArrayContent(CompressionHelper.GZipBytes(bytes.Result)); actionExecutedContext.Response.Content.Headers.Add( "Content-Encoding" , "gzip" ); break ; case "deflate" : actionExecutedContext.Response.Content = new ByteArrayContent(CompressionHelper.DeflateBytes(bytes.Result)); actionExecutedContext.Response.Content.Headers.Add( "Content-encoding" , "deflate" ); break ; } return DefaultResult(actionExecutedContext, cancellationToken); } private Task DefaultResult(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken) { return base .OnActionExecutedAsync(actionExecutedContext, cancellationToken); } } /// <summary> /// 压缩帮助类 /// </summary> internal static class CompressionHelper { public static byte [] DeflateBytes( byte [] bytes) { if (bytes.Length == 0) { return null ; } using ( var output = new MemoryStream()) { using ( var compressor = new DeflateStream(output, CompressionMode.Compress, CompressionLevel.Default)) { compressor.Write(bytes, 0, bytes.Length); } return output.ToArray(); } } public static byte [] GZipBytes( byte [] bytes) { if (bytes.Length == 0) { return null ; } using ( var output = new MemoryStream()) { using ( var compressor = new GZipStream(output, CompressionMode.Compress, CompressionLevel.Default)) { compressor.Write(bytes, 0, bytes.Length); } return output.ToArray(); } } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构