Webサービスは、メソッドのみを公開できるが、公開するメソッドはアクセス修飾子がpublicで更にWebMethodAttributeが付加されている必要がある。
Webサービスを他のプロジェクトから利用するには、利用するプロジェクトにWeb参照を追加してやればいい。
プロジェクトにWeb参照を追加した後にWebサービスが更新された場合は、Web参照を更新する必要がある。
以下に、Webサービスを利用するサンプルコードを示す。
Webサービス(HogeService)を利用するサンプルコードpublic void WebServiceTestMethod()
{
HogeService hoge = new HogeService();
hoge.Method1();
hoge.Method2();
}
一見すると普通のクラスと同じように扱えるように見える。しかしWebサービスの挙動は普通のクラスとは大きく異なる。
まず、ユーザーがHogeServiceに定義したコンストラクタは、HogeServiceのインスタンス化の時点では呼び出されない。そして、HogeServiceのWebメソッドにアクセスするたびに、ユーザーが定義したコンストラクタが呼び出される。(更に、WebサービスのDispose()メソッドも呼び出される。)
つまり、WebメソッドにアクセスするたびにWebサービスは全く別のインスタンスとなってしまうのだ。
なぜ、このような挙動を取るかというと、ここで利用しているHogeServiceクラスは、Webサービス本体ではなく、Webサービスにアクセスするためのプロキシクラスだからである。プロキシクラスは、Web参照の追加を行うと自動で生成される。
プロキシクラスには、Webメソッドを呼び出すためのメソッド(Webメソッドと同名)が用意される。このメソッドは、Webサービスに対してSOAPプロトコルでWebメソッドの処理要求をする。Webメソッドの処理要求を受信したWebサービスは、(Webサービスが配置されている場所で)インスタンス化→Webメソッド実行→Dispose()実行を行い、プロキシクラスに対してSOAPプロトコルで処理結果を返却する。そして処理結果を受け取ったプロキシクラスのメソッドはその処理結果を返却する。
なお、プロキシクラスには、Webメソッドを非同期に呼び出すためのメソッドも用意される。