gpt4 book ai didi

asp.net-core - 在 dotnet core 2 asp .net 中路由特定响应压缩?

转载 作者:行者123 更新时间:2023-12-05 02:18:14 25 4
gpt4 key购买 nike

这可能看起来有点毫无意义,但我希望我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com