英文:
ninject and gzip response conflict
问题
I am using this compress attribute to compress my response from web API.
After adding Ninject to my project, the compress attribute doesn't work correctly, and it produces some unrecognized characters like this:
h=d ݛMo 6 ߢxl C)
xoE W cW6 }IQ fb B `I " ;3 |+N ) ߊ ևۦ0dE i > ~jv 闯 Ԭ R{l
How can I resolve it?
using System.IO.Compression;
public class CompressAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(encodingsAccepted)) return;
encodingsAccepted = encodingsAccepted.ToLowerInvariant();
var response = filterContext.HttpContext.Response;
if (encodingsAccepted.Contains("deflate"))
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
else if (encodingsAccepted.Contains("gzip"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
}
}
英文:
I am using this compress attribute to compress my response from web API.
After adding ninject to my project, the compress attribute doesn't work correctly, and it produces some unrecognized character like this:
h=d ݛMo 6 ߢxl C)
xoE W cW6 }IQ fb B `I " ;3 |+N ) ߊ ևۦ0dE i > ~jv 闯 Ԭ R{l
How can I resolve it?
using System.IO.Compression;
public class CompressAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(encodingsAccepted)) return;
encodingsAccepted = encodingsAccepted.ToLowerInvariant();
var response = filterContext.HttpContext.Response;
if (encodingsAccepted.Contains("deflate"))
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
else if (encodingsAccepted.Contains("gzip"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
}
}
```
</details>
# 答案1
**得分**: 1
以下是翻译好的部分:
这是完全预期的,也是正确的,压缩可能会产生不可打印的字符。所有256个可能的字节值都用于最大压缩。
您的代码不正确,HTML编码“deflate”实际上表示zlib流,而不是原始的deflate流。在这种情况下,您需要使用`zlibStream`,而不是`deflateStream`。
<details>
<summary>英文:</summary>
It is entirely expected and correct for compression to produce unprintable characters. All 256 possible byte values are used for maximum compression.
Your code is incorrect in that the HTML encoding "deflate" actually means a zlib stream, not a raw deflate stream. (Unfortunate choice of a word there.) So you need to use `zlibStream` in that case, not `deflateStream`.
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论