我有一个问题,看起来像这里描述的那个
虽然这个解决方案似乎对我不起作用
我的目标框架是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.AddResponseCompression
在ConfigureServices
方法中被调用
问题如下…
当我旋转我的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
但这不应该是解决方案我还是不明白为什么原来的版本不能工作