作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这可能看起来有点毫无意义,但我希望我的 API 端点之一支持“最佳”gzip 压缩。对于所有其他人,我想要“无”或“最快”。
这可能吗?我怎样才能做到这一点?
最佳情况下,我想以某种方式从 Controller 操作中向服务指示我希望对当前请求进行 GZip 压缩以及要使用的设置。
我在想我可以尝试从 ResponseCompressionMiddleware 中提取 Invoke 方法并将其混入它自己的服务中,但我想先看看是否有更简单的方法。
最佳答案
好吧,我玩这个的时间太长了。这个答案是为了分享我是如何设法让它工作的,但我不建议使用这种方法,希望有人能指出我错过的一个非常简单的方法。
因此,事不宜迟,以下代码可以满足我的需求:
class GZipAttribute : ResultFilterAttribute
{
private class ResponseCompressionOptionsProvider : IOptions<ResponseCompressionOptions>
{
private class GZipCompressionProviderOptionsProvider : IOptions<GzipCompressionProviderOptions>
{
public GZipCompressionProviderOptionsProvider(CompressionLevel compressionLevel)
{
this.Value = new GzipCompressionProviderOptions()
{
Level = compressionLevel
};
}
public GzipCompressionProviderOptions Value { get; private set; }
}
public ResponseCompressionOptionsProvider(CompressionLevel level)
{
this.Value = new ResponseCompressionOptions()
{
EnableForHttps = true
};
this.Value.Providers.Add(new GzipCompressionProvider(new GZipCompressionProviderOptionsProvider(level)));
}
public ResponseCompressionOptions Value { get; private set; }
}
public CompressionLevel CompressionLevel { get; private set; }
public bool BodyContainsSecret { get; private set; }
public bool BodyContainsFormInput { get; private set; }
public GZipAttribute(CompressionLevel compressionLevel, bool bodyContainsSecret = true, bool bodyContainsFormInput = true)
{
CompressionLevel = compressionLevel;
}
private void logSkippingGzip(ResultExecutingContext ctxt, string reason)
{
ILogger logger = ctxt.HttpContext.RequestServices.GetService<ILogger>();
logger.LogWarning("[GZip] SKIPPED -- " + reason);
}
public override async Task OnResultExecutionAsync(ResultExecutingContext executingContext, ResultExecutionDelegate next)
{
if (executingContext.HttpContext.Request.IsHttps && BodyContainsFormInput && BodyContainsSecret)
{
logSkippingGzip(executingContext, "Request is HTTPS but endpoint is not marked as being impervious to BREACH exploit.");
await next();
}
else
await new ResponseCompressionMiddleware((context) => { return next(); }, new ResponseCompressionProvider(executingContext.HttpContext.RequestServices, new ResponseCompressionOptionsProvider(CompressionLevel))).Invoke(executingContext.HttpContext);
return;
}
}
它现在似乎可以流畅地工作,但我想要更简洁的东西。如果你们有任何其他想法,请告诉我。要应用它,我只需将 [GZip(CompressionLevel.Optimal)]
添加到我的 MVC Controller 中的任何操作。
关于asp.net-core - 在 dotnet core 2 asp .net 中路由特定响应压缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46108309/
我是一名优秀的程序员,十分优秀!