【问题标题】:.Net Web API 2 POST consuming gzip compressed content.Net Web API 2 POST 使用 gzip 压缩内容
【发布时间】:2017-02-06 19:30:01
【问题描述】:

我正在编写一个具有这种 POST 方法的 .Net Web Api (2)。此方法当前使用标准 JSON 格式化程序反序列化它的唯一参数。我们还在编写将使用此 Api 的 C# 客户端使用 System.Net.Http.HttpClient 进行通信的客户端。

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

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

  • 客户端类似于this
  • 服务器端类似于this

所以,我的问题...

我真的需要为此编写所有这些自定义代码吗?是否有一种内置方法可以减少请求的占用空间?

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

【问题讨论】:

  • 你找到解决这个问题的方法了吗??
  • 没有开箱即用的东西。按照我在帖子中添加的链接,我最终实现了一个 DelegatingHandler,如果存在内容编码“gzip”标头,它会解压缩请求。 (覆盖 SendAsync)。

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


【解决方案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();
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多