はじめに
私たち開発者はみな、何らかの仮定に基づいてプログラミングを行います。その仮定の中で最も大きなものは、「.NET Frameworkに付属するライブラリとツールは、決まったタスクを達成するための最善の方法である」ということです。例えばほとんどの開発者は、Webサイトのユーザーアカウントを管理するためには、ユーザーアカウントストアを自作するよりも、ASP.NETのMembershipシステムを使った方がよいと当然のように思っています。Webサービスに接続するときのWeb参照の追加についても、同様のことが言えます。私たちは当然のように、Web参照を追加することで、Webサービスの呼び出し、パラメータのシリアライズなどの低レベルの詳細を処理するプロキシクラスを自動生成するマークアップを生成しています。
最近、.NET FrameworkおよびWebサービスに関する私たちの基本的な仮定の1つについて、顧客から質問を受けました。それは「Webサービスに接続するために、なぜVisual Studioが作成したプロキシクラスを使用しなければならないのか?」というものでした。このプロジェクトでは、Webサービスを呼び出してデータを取得し、それからソートと若干の書式設定をしたうえでWebページに表示していました。しかし顧客は、HttpWebRequestクラスでWebサービスを直接呼び出し、XML出力を取得し、XmlDocumentオブジェクトにロードし、それからXSLTを使用してその結果をHTMLに出力する方が効率的ではないかと仮説を立てました。確かに、その方がVisual Studioの自動生成プロキシクラスを使用するより速いようにも思えます。
この質問を受ける前は、プロキシクラスの自作を考えたことはありませんでした。これまではいつも、Visual Studioが自動生成したプロキシクラスを利用してきたのです。これらの自動生成プロキシクラスが非効率的ということはあるでしょうか? WebサービスのXMLを直接取得して構文解析する方が効率的でしょうか? これを確実に知るためには、顧客の仮説をテストしてみるしかありませんでした。
この記事では、この仮説をテストするために行った実験を詳しく解説します。最後まで読んで、結果を確認してください。
Webサービスを呼び出すための2つのアプローチ
Visual Studioの[Web参照の追加]オプションは、Webサービスを呼び出すための便利なツールです。このツールでは、WebサービスのWSDLファイルのURLを指定できます。これはXML形式のファイルであり、Webサービスによって提示されたメソッドと通信プロトコル、およびWebサービスとの対話に欠かせないその他の低レベル情報を記述しています。このWSDLファイルから、Visual StudioはWebサービスのメソッドを「ラップ」するプロキシクラスを自動的に生成します。要するに、プロキシクラスはWebサービスの各メソッドに対するメソッドを持っています。プロキシクラスのメソッドは、プロジェクト内のその他のクラスのメソッドを呼び出すのと同じ感覚で呼び出すことができます。しかしその舞台裏では、プロキシクラスはメソッドの入力パラメータをXMLにシリアライズし、WebサービスへのHTTP要求を行い、HTML応答で返されたXMLをデシリアライズしています。Webサービスの詳しい解説はこの記事の範囲を超えるので、Webサービスの基礎について詳しく知りたい場合は記事「An Extensive Examination of Web Services」を参照ください。
プロキシクラスによってWebサービスとの対話は大幅に簡略化されますが、Webサービスとの通信にプロキシクラスを使用しなければならない理由はありません。代わりに、.NET FrameworkのSystem.Net名前空間内のクラスを使用してWebサービスにHTTP要求を行い、System.Xml名前空間内のクラスを使用して応答を構文解析することもできます。これが、顧客から提案されたアプローチでした。つまり、HttpWebRequestクラスを使用してWebサービスを呼び出し、XSLTを使用してXML応答をHTMLに変換し、そしてブラウザに発行できます。この提案の背後にあるのは、自動生成されたプロキシクラスにはオーバーヘッドがあり、これはより直接的な手段によって解消可能であるという仮定です。