大雑把には以下の通り。
- クライアント
- HTTPヘッダにAccept-Encoding: gzipをつけて要求を投げる。
- 応答がContent-Encoding: gzipの場合に、帰ってきた応答を伸張する
- サービス側(必ずしもサービス自身が担当するわけではなく)
- 要求のHTTPヘッダにAccept-Encoding: gzipが含まれる場合、HTTP応答本文をgzipで圧縮して返す
最も手数の少ない方法は、
- クライアント=.NET Framework 2.0(手元の環境をVS2005にしたのでもうこれしか確認できない)
- サービスの応答がクライアントに帰る直前、要はmod_deflateを用いて圧縮する
クライアント編
- Web参照から生成したコードで、サービス呼び出しのスタブにあるEnableDecompressionプロパティにtrueをセットして呼び出すだけ。すばらしいシンプルさ。(06/03/01:と思ったらドキュメントによれば既定値trueらしい。あらら)
- 後は、Accept-Encodingを付けることもHTTP応答本文を伸張することも.NET Frameworkがやってくれる。
サーバ編
- 以下の通り、JkMountでApache→Tomcatに転送しているので、転送範囲の応答はmod_defalteで圧縮しちゃう。今のところウェブサービス以外のリソースはないのでブラウザのことは考えないで圧縮指定。
JkMount /KeitaisoWS/services/KeitaisoKaisekiService* ajp13
<Location "/KeitaisoWS/">
AddOutputFilterByType DEFLATE text/html text/plain text/xml
</Location>
- あとはSIGHUPを送るなどして設定を有効に。
応答を見てみる
見てみると言っても、クライアントコードがメッセージを受け取った時点で伸張されていてシームレスなので、通信内容をパケットキャプチャして確認する。- 応答圧縮を受け入れない場合
≫POST /KeitaisoWS/services/KeitaisoKaisekiService HTTP/1.1
≫User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.42)
≫Content-Type: text/xml; charset=utf-8
≫SOAPAction: ""
≫Host: passing.breeze.cc
≫Content-Length: 557
≫Expect: 100-continue
≫Connection: Keep-Alive
≫
≫HTTP/1.1 100 Continue
≫
≫(要求本文)
≪HTTP/1.1 200 OK
≪Date: Mon, 27 Feb 2006 17:32:20 GMT
≪Server: Apache
≪Vary: Accept-Encoding
≪Connection: close
≪Transfer-Encoding: chunked
≪Content-Type: text/xml;charset=utf-8
≪
≪(以下応答)
- 応答圧縮を受け入れる場合
≫POST /KeitaisoWS/services/KeitaisoKaisekiService HTTP/1.1
≫User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.42)
≫Content-Type: text/xml; charset=utf-8
≫SOAPAction: ""
≫Host: passing.breeze.cc
≫Content-Length: 557
≫Expect: 100-continue
≫Accept-Encoding: gzip
≫
≪HTTP/1.1 100 Continue
≪
≫(要求本文)
≪HTTP/1.1 200 OK
≪Date: Mon, 27 Feb 2006 17:32:30 GMT
≪Server: Apache
≪Vary: Accept-Encoding
≪Content-Encoding: gzip
≪Connection: close
≪Transfer-Encoding: chunked
≪Content-Type: text/xml;charset=utf-8
≪
≪(圧縮された応答)
- 今回の例では、約8000バイトの応答が、約2000バイトになった。