在ASP中使用GZIP的问题. NET Core MVC与f#



我有一个问题,看起来像这里描述的那个

虽然这个解决方案似乎对我不起作用

我的目标框架是netcoreapp2.2,我使用f#。

我正在用微软ASP工作。. NET Core Web API项目(通常应该与c#工作相同)。

我试图返回GZip压缩响应我选择了addresponseccompression中间件解决方案(请记住,我使用的是fsharp)

这是我的配置方法

member this.Configure(app: IApplicationBuilder, env: IHostingEnvironment) =

if (env.IsDevelopment()) 
then app.UseDeveloperExceptionPage() |> ignore
else app.UseHsts() |> ignore

app.UseResponseCompression() |> ignore
app.UseMiddleware<JwtMiddleware>() |> ignore
app.UseCors "AllowAll" |> ignore
app.UseMvc() |> ignore
app.UseSwagger()  |> ignore
app.UseSwaggerUI(
fun c ->
c.SwaggerEndpoint(
"/swagger/doc/swagger.json", "Offer Management API")
|> ignore
)
|> ignore

这里是我的ConfigureServices方法

member this.ConfigureServices(services: IServiceCollection) =
// Add framework services.
let configBuilder =
ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true)
.AddJsonFile("appsettings."+this.Env.EnvironmentName+ ".json", true)
.AddEnvironmentVariables ()
let config = configBuilder.Build ()

services.Configure<ApiConfig> config |> ignore 

services.AddResponseCompression (
fun opt ->
opt.EnableForHttps <- true
opt.Providers.Add<GzipCompressionProvider>() |> ignore
) 
|> ignore

services.Configure<GzipCompressionProviderOptions>(
fun (options:GzipCompressionProviderOptions) -> 
options.Level <- CompressionLevel.Optimal
) 
|> ignore

services.AddCors (
fun o -> 
o.AddPolicy (
"AllowAll", 
fun b -> 
b
.SetIsOriginAllowed(fun _ -> true)
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials()
|> ignore
)
) 
|> ignore
services.AddMvc(
fun config ->            
config.Filters.Add(OffManExceptionFilter());
).AddJsonOptions(
fun opt ->
opt.SerializerSettings.Converters.Add (OptionConverter())
opt.SerializerSettings.Converters.Add(Converters.StringEnumConverter())
opt.SerializerSettings.ContractResolver <- RequireAllPropertiesContractResolver()
opt.SerializerSettings.DateTimeZoneHandling <-  DateTimeZoneHandling.Utc
).SetCompatibilityVersion(CompatibilityVersion.Version_2_2) 
|> ignore

可以看到,在Configure方法中,app.UseResponseCompression()app.UseMvc()之前被调用,services.AddResponseCompressionConfigureServices方法中被调用

问题如下…

当我旋转我的Api时,当我使用{"Accept-Encoding"= "gzip"}或不

PS C:Userslnimong> curl 'http://localhost:5000/status/dbg' -H @{"Accept-Encoding" = "gzip"}

StatusCode        : 200
StatusDescription : OK
Content           : {"deal_items":[{"id":"002b0c20-d01f-4d3d-804a-851a27427679","catalog_id":62056,"deal_id":"04328e2b-dc0e-4d71-8b5c-db49c02c79d9","article_id":"79810fc1-ea20-4825-9e2b-e6d7cf8bdc8e","raw_article_id":342...
RawContent        : HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Type: application/json; charset=utf-8
Date: Tue, 10 Aug 2021 15:39:39 GMT
Server: Kestrel
{"dea...
Forms             : {}
Headers           : {[Transfer-Encoding, chunked], [Content-Encoding, gzip], [Vary, Accept-Encoding], [Content-Type, application/json; charset=utf-8]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 1334342

PS C:Userslnimong> curl 'http://localhost:5000/status/dbg'

StatusCode        : 200
StatusDescription : OK
Content           : {"deal_items":[{"id":"002b0c20-d01f-4d3d-804a-851a27427679","catalog_id":62056,"deal_id":"04328e2b-dc0e-4d71-8b5c-db49c02c79d9","article_id":"79810fc1-ea20-4825-9e2b-e6d7cf8bdc8e","raw_article_id":342...
RawContent        : HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Tue, 10 Aug 2021 15:39:46 GMT
Server: Kestrel
{"deal_items":[{"id":"002b0c20-d01f-4d3d-804a-851a27...
Forms             : {}
Headers           : {[Transfer-Encoding, chunked], [Content-Type, application/json; charset=utf-8], [Date, Tue, 10 Aug 2021 15:39:46 GMT], [Server, Kestrel]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 1334342

RawContentLength在两种情况下基本相同。

我错过了什么?(

再深入挖掘结果发现它已经在恒星上工作了我没有在响应

中捕获Content-Encoding: gzip

抱歉给您带来不便

有趣的事实…

我设法通过创建一个自定义提供程序使其工作


type CustomCompressionProvider() = 
interface ICompressionProvider with
member this.CreateStream (outputStream:Stream) = 
(new GZipStream(outputStream, CompressionLevel.Optimal, true) :> Stream)
member this.EncodingName:string  = "dbg"
member this.SupportsFlush = true
...
services.AddResponseCompression (
fun opt ->
opt.EnableForHttps <- true
opt.Providers.Add<GzipCompressionProvider>() |> ignore
opt.Providers.Add<CustomCompressionProvider>() |> ignore
) 
|> ignore

但这不应该是解决方案我还是不明白为什么原来的版本不能工作

最新更新