利用 ActionFilter 为 ASP.NET Web API 添加 GZip 压缩功能

本文介绍了一个自定义的WebAPI压缩属性,通过Deflate压缩算法减少响应数据大小,提高传输效率。该实现支持根据客户端请求自动判断是否启用压缩,并提供了一个示例控制器用于演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码

public class DeflateCompressionAttribute : ActionFilterAttribute
{
   public override void OnActionExecuted(HttpActionExecutedContext actContext)
   {
       var contentType = actContext.Response.Content.Headers.ContentType.ToString();
       var content = actContext.Response.Content;
       var bytes = content == null ? null : content.ReadAsByteArrayAsync().Result;
       var zlibbedContent = bytes == null ? new byte[0] : 
       CompressionHelper.DeflateByte(bytes);
       actContext.Response.Content = new ByteArrayContent(zlibbedContent);
       actContext.Response.Content.Headers.Remove("Content-Type");
       actContext.Response.Content.Headers.Add("Content-encoding", "deflate");
       actContext.Response.Content.Headers.Add("Content-Type", contentType);
       base.OnActionExecuted(actContext);
    }
}

public class CompressionHelper
{ 
    public static byte[] DeflateByte(byte[] str)
    {
        if (str == null)
        {
            return null;
        }

        using (var output = new MemoryStream())
        {
            using (var compressor = new Ionic.Zlib.DeflateStream(output, Ionic.Zlib.CompressionMode.Compress, Ionic.Zlib.CompressionLevel.BestSpeed))
            {
                compressor.Write(str, 0, str.Length);
            }

            return output.ToArray();
        }
    }
}

使用 DeflateCompression 来标记需要压缩的 Web API

public class V1Controller : ApiController
{
    [DeflateCompression]
    public HttpResponseMessage GetCustomers()
    {

    }
}

备注

  • 增加对 Request 中 Accept-Encoding 设定的判断,如果客户端请求包含压缩请求才进行压缩
  • 示例利用了第三方库来进行,可以视情况来自定义替换为其他库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值