ninject and gzip response conflict

huangapple go评论55阅读模式
英文:

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 &quot;deflate&quot; 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>



huangapple
  • 本文由 发表于 2023年4月17日 20:24:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/76035130.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定