サービス→クライアントへの応答をgzipで圧縮し、転送量を小さく。
大雑把には以下の通り。
  • クライアント
    • HTTPヘッダにAccept-Encoding: gzipをつけて要求を投げる。
    • 応答がContent-Encoding: gzipの場合に、帰ってきた応答を伸張する
  • サービス側(必ずしもサービス自身が担当するわけではなく)
    • 要求のHTTPヘッダにAccept-Encoding: gzipが含まれる場合、HTTP応答本文をgzipで圧縮して返す
前提とする環境は、サーバ側=Tomcat+AxisでApache+mod_jk。
最も手数の少ない方法は、
  • クライアント=.NET Framework 2.0(手元の環境をVS2005にしたのでもうこれしか確認できない)
  • サービスの応答がクライアントに帰る直前、要はmod_deflateを用いて圧縮する
というところか。Tomcat→Apache間のメッセージが圧縮されないのがイマイチだが、TomcatのFilterを用いて圧縮する方法で実現しようと思ったらやたら手数が多かったから・・・・。servlets-examplesにサンプルが付いているけど、十分複雑だよ。。。)

クライアント編

  • 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バイトになった。

おわりに

次はAxisクライアントで同じことをやってみようと思うが、client-config.wsddでhttpトランスポートを置き換えないとダメなのかな?と考えただけで、面倒くせぇ~という気分になるな。