asp.net-web-api - 2个不同的aspnet核心webapi `Actions`上的2个不同的`Content-Encoding`
问题描述
我有Controller1/Action1
,目前不关心Accept-Encoding
请求和返回application/json
响应。
现在在同一个应用程序中,我们正在添加Controller2/Action2
,它将返回巨大的 json (~5mb) 并且想要使用压缩并决定使用gzip
. 我们new client_2
已经Controller2/Action2
准备好将其作为gzip
.
虽然Controller1/Action1
仍然必须返回Content-Encoding
asapplication/json
和 NOT gzip
,因为我不认为所有client_1s
的Controller1/Action1
passAccept-Encoding
标题。
那么我怎样才能在 2 differentContent-Encoding
上实现 2 different Actions
。
在 aspnet 管道中添加以下压缩会导致所有操作的 gzip 并且不会返回我总是想要JSON
的Controller1/Action1
,因为我不认为所有人client_1s
都有能力消费gzip
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression(options => { options.EnableForHttps = true; });
services.Configure<GzipCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Optimal;
});
}
仅在 Action 上添加以下属性似乎也没有任何效果,我没有得到任何回复
[Produces("application/gzip")]
解决方案
如果使用 GZip 压缩,Action Controller2/Action2 总是以二进制格式返回数据。因此,您必须将响应标头中的“内容编码”更改为二进制。例如,在响应标头中,尝试给出以下内容
Content-Encoding: gzip
Vary: Accept Encoding
在请求标头中,给出以下内容,
Accept-Encoding: br, compress, gzip
还有另一种方法,您可以使用以下代码将压缩的二进制文件转换为字符串,这将被接受 JSON 的客户端接受。
using (var stream = new MemoryStream())
{
using (var zip = new GZipStream(stream, CompressionMode.Compress, true))
{
var formatter = new BinaryFormatter();
formatter.Serialize(zip, list);
}
var byteArray = stream.ToArray();
StringBuilder sb = new StringBuilder();
foreach (byte item in byteArray)
{
sb.Append((char)item);
}
return sb.ToString();
}
推荐阅读
- excel - 在 Laravel 中使用 maatwebsite excel 和日期导入
- oracle-nosql - 如何将 prepare_statement 与 OCI Python SDK 和 NoSQL 云服务一起使用?
- java - Kafka 安全拦截器:启动我的卡夫卡服务器时无法调用我的自定义类
- python - Python:如何旋转包含列表的数据框?
- azure - Azure IoT 设备到云,指标图在特定时间戳下降到零
- javascript - Material-UI Rating 返回字符串而不是数字
- android - Android 中的 BLE 设备响应:字节数组到 Kotlin 中的右浮点值
- jsf - JSF 运行时是什么意思?
- java - Java中的私有访问修饰符
- java - 我希望用户像 Whatsapp 一样回复多个远程通知