WCF Data ServicesはHTTPベース(ODataやJSON等)を使用してデータの送受信ができる強力な仕組みです。このあたりの説明はとりあえず割愛。
で、便利が故にぽんぽん使ってるとそれなりに転送量や帯域も消費するわけでして。でHTTPベースであればgzipで圧縮して通信したいと思うのが世の常。
というわけでさくっとgzip圧縮する方法です。
1. WCF Data Servicesの準備
こちらは特に何もする必要ありません。
強いてあげるならIIS側で動的圧縮を有効にしておく必要がありますので、忘れず設定します。
Content-Typeによっては無効になってる可能性があるので注意しましょう。(例:*/*)
2. クライアント側
クライアント側は公開されてるWCF Data Servicesをサービス参照の追加で追加・プロキシを生成します。
呼び出しコードは以下の通り
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { try { Console.WriteLine("HostName:"); string host = Console.ReadLine(); var ent = new ServiceReference1.sampleEntities(new Uri("http://" + host + "/users/sample.svc")); foreach (var user in ent.Users) { Console.WriteLine("User:{0}\tDescription:{1}", user.UserName, user.Description); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } Console.Read(); } } }
ではまずこの段階で実行して結果を見たいと思います。
レスポンス見ると圧縮されずそのまま出力されているのがわかります。
ちなみにHTTPだけのサイズを見ると Req/Resで計2234バイトでした。
さてこのクライアントにgzipでの通信を要求するようにしたいと思います。
以前Form認証を利用する手順でも紹介したように、EntitiesクラスのPartialクラスを作成し、OnSendingRequest イベントでRequestのAutomaticDecompression プロパティに許可する圧縮方式を指定します。
using System; using System.Net; using System.Data.Services.Client; namespace ConsoleApplication1.ServiceReference1 { public partial class sampleEntities { partial void OnContextCreated() { this.SendingRequest += new EventHandler<SendingRequestEventArgs>(OnSendingRequest); } public void OnSendingRequest(object sender, SendingRequestEventArgs e) { ((System.Net.HttpWebRequest)e.Request).AutomaticDecompression = DecompressionMethods.GZip; } } }
ちなみにHTTPの仕様にのっとりAccept-EncodingヘッダをRequestHeadersに追加しても良いのですが、受信時にデシリアライズできなくてしにます。
AutomaticDecompressionプロパティで指定すると、HTTPリクエストヘッダへのAccept-Encoding付与と、受信時の解凍を自動的にしてくれますので便利ですね。
では実際に実行してみましょう。
実行するとHTTPリクエストヘッダに Accept-Encoding: gzip が付与されているのがわかります。
受信したサーバー側(IIS)は条件に応じて圧縮してレスポンスを返してくれます。
結果はこちら
ContentEncoding: gzip で返ってきてますね。本文も圧縮されて中身がぱっと見わからなくなっています。
HTTPだけをみた場合のサイズも計1318バイトとなっており、非圧縮時にくらべて59%弱にはなってる感じです。
まぁ元データがしょぼいので参考になりませんが。
ということで意外と簡単にできるWCF Data Servicesのgzip圧縮通信でした。おわり。