web api中的gZip压缩/解压缩

时间:2018-03-20 08:19:04

标签: c# asp.net-web-api swagger gzip

我们正在使用gZip来压缩/解压缩从web api收到的响应。以下是我们的实施。

[Route("Location")]
    [HttpGet]
    [DeflateCompression]
    public async Task<IEnumerable<DisplayLocation>> GetLocation(string searchTerm = null, string impersonationUserId = null)
    {
        IEnumerable<DisplayLocation> locations= await DisplayLocationServer.GetLocation(searchTerm, WebUser);
        return locations;
    }

和OnActionExecuted方法添加了压缩逻辑

public override void OnActionExecuted(HttpActionExecutedContext actContext)
    {
        IEnumerable<string> acceptedEncoding =
            GetAcceptedEncodingFromHeader(actContext.Request);
        if(acceptedEncoding != null && acceptedEncoding.Contains("deflate"))
        {
            HttpContent content = actContext.Response.Content;
            byte[] bytes = content?.ReadAsByteArrayAsync().Result;
            byte[] 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", "application/json");
        }
        base.OnActionExecuted(actContext);
    }

private IEnumerable<string> GetAcceptedEncodingFromHeader(HttpRequestMessage request)
    {
        IEnumerable<string> headerValues = new List<string>();
        if(request.Headers != null)
        {
            request.Headers.TryGetValues("Accept-Encoding", out headerValues);
        }

        return headerValues;
    }

直到这个压缩逻辑,它工作正常。但是,当我们尝试将响应从api端返回到UI时,它会给出错误。

我们正在使用swagger来使用web api,它自动生成代码并从代码请求/响应完成。响应将从自动生成的代码发送到UI。

下面是自动生成的代码,其中内容将从实际的api方法返回反序列化。

String _responseContent = await _httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false);

            try
            {
                _result.Body = Microsoft.Rest.Serialization.SafeJsonConvert.DeserializeObject<System.Collections.Generic.IList<DisplayLocation>>(_responseContent, this.Client.DeserializationSettings);
            }
            catch (Newtonsoft.Json.JsonException ex)
            {
                _httpRequest.Dispose();
                if (_httpResponse != null)
                {
                    _httpResponse.Dispose();
                }
                throw new Microsoft.Rest.SerializationException("Unable to deserialize the response.", _responseContent, ex);
            }

由于内容采用压缩格式,因此响应无法正确反序列化。

所以我的问题是我们如何正确压缩内容/响应,这将与此代码一起使用?

此外,我们无法对自动生成的代码进行更改,因为将来可能会再次自动生成代码,因此手动更改将会丢失。

简而言之,我们试图在UI端获取压缩内容,并在那里编写解压缩逻辑。但由于swagger / auto生成的代码,它仅在那时失败。

对此有任何帮助表示赞赏!

0 个答案:

没有答案