我们正在使用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生成的代码,它仅在那时失败。
对此有任何帮助表示赞赏!