プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

ASP.NETのWeb APIの戻りを圧縮して返す

.NET FrameworkASP.NETの話です(Coreは知らない)

Web APIででっかいjson返すようなときにgzipで圧縮してほしい、ってことを定期的に調べているので自分用に書いておきます

自動でやってくれない・・・よね?

準備

Visual Studio 2017で「ASP.NET Web アプリケーション (.NET Framework)」のテンプレート使って新しいプロジェクト作ります。(Web APIのチェック忘れずに)

ValuesControllerができていると思うのでちょっとだけ修正

public IEnumerable<string> Get()
{
    return new string[] { "value",
        "value", "value", "value",
// ・・・
// たくさん返す
// 
        "value", "value", "value",
    };
}

4K以上(?)の戻りでないと圧縮してくれないようなのでたくさん返すようにします

とりあえずこれでIISに発行して上記APIをEdgeで呼んでみます

f:id:puni-o:20171215170552j:plain

Accept-Encoding:gzip,deflateとなってますが応答は圧縮されてません

圧縮するようにする

Nugetから下の二つをげと

PM> Install-Package Microsoft.AspNet.WebApi.Extensions.Compression.Server

PM> Install-Package System.Net.Http.Extensions.Compression.Client

Global.asax.csに一行追加

protected void Application_Start()
{
    GlobalConfiguration.Configuration.MessageHandlers.Insert(0, new ServerCompressionHandler(new GZipCompressor(), new DeflateCompressor()));

んでやり直し

f:id:puni-o:20171215170834j:plain

ちゃんとgzipで圧縮して返してくれました