.Net Web API 2 POST消费gzip压缩内容

时间:2017-02-06 19:30:02

标签: asp.net-web-api2 gzip dotnet-httpclient gzipstream

我正在编写一个拥有这一个POST方法的.Net Web Api(2)。此方法目前通过使用标准JSON格式化程序对其唯一参数进行反序列化。我们也在编写客户端,使用System.Net.Http.HttpClient来使用这个Api和C#客户端进行通信。

有可能移动大量数据。这使我们考虑减少请求的占用空间。

搜索此网站后,我发现了一些使用gzip压缩的替代方案。我已经有了一个可靠的概念证明:

  • 客户端方面的问题this
  • 服务器方面的问题this

所以,我的问题......

我真的需要为此编写所有这些自定义代码吗?是否有内置的方法来降低请求的占用空间?

有些文章提及在IIS中启用gzip(或deflate)(请参阅Enable IIS7 gzip)。这对我不起作用(我启用它,我仍然在客户端进行压缩,从服务器中删除了DelegatingHandler ......但没有,我最终在控制器方法中使用了null参数)

1 个答案:

答案 0 :(得分:1)

我最终实现了一个DelegatingHandler来查找ContentEncoding" gzip"并相应地解压缩。

using System;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace WebApi.MessageHandlers
{
    /// <summary>
    /// GZip message handler. 
    /// </summary>
    public class GZipMessageHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (IsRequestCompressed(request))
            {
                request.Content = Descompress(request.Content);
            }
            return base.SendAsync(request, cancellationToken);
        }

        private bool IsRequestCompressed(HttpRequestMessage request)
        {
            return request.Content.Headers.ContentEncoding.Contains("gzip", StringComparer.OrdinalIgnoreCase);
        }

        private HttpContent Descompress(HttpContent content)
        {
            // Handle compression...
            throw new NotImplementedException();
        }
    }
}