属性はWebサービスを記述する場合にも、便利に使われる。Visual Studio .NETでWebサービスのプロジェクトを作成すると自動生成されるソース・コードには、コメントとしてHelloWorldメソッドが埋め込まれている。コメント記号を外してこれを有効にしたのがList 20-10である。
1: using System;
2: using System.Collections;
3: using System.ComponentModel;
4: using System.Data;
5: using System.Diagnostics;
6: using System.Web;
7: using System.Web.Services;
8:
9: namespace Sample010
10: {
11: /// <summary>
12: /// Service1 の概要の説明です。
13: /// </summary>
14: public class Service1 : System.Web.Services.WebService
15: {
16: public Service1()
17: {
18: //CODEGEN: この呼び出しは、ASP.NET Web サービス デザイナで必要です。
19: InitializeComponent();
20: }
21:
22: ... Component Designer generated code ...
23:
24: [WebMethod]
25: public string HelloWorld()
26: {
27: return "Hello World";
28: }
29: }
30: }
これをVisual Studio .NETから実行するとInternet Explorerが立ち上がり、Fig.20-9のような情報が表示される。
HelloWorldメソッド・リンクをクリックすれば、Fig.20-10のように詳細を知ることができる。
テストのため、[起動]ボタンを押すとFig.20-11のようになる。
見所はもちろん24行目のWebMethod属性である。このクラスには複数のメソッドが含まれているが、Webメソッドとして公開されるのはWebMethod属性の付いたメソッドだけである。古い世代のプログラミング言語では、このような指定をソース・コードに記述可能とするために回りくどい方法や独自拡張などを用いていたが、C#では属性を用いることでエレガントに実現している。
List 20-10のサンプルはそのままでは実用に耐えない。なぜなら、名前空間として「http://tempuri.org/」という一時利用のためのものが使われているからだ。これを正規のサービス用のものに置き換えなければならない。さらに、よりきめ細かく指定も書き込んでみよう。List 20-11を見てほしい。
1: using System;
2: using System.Collections;
3: using System.ComponentModel;
4: using System.Data;
5: using System.Diagnostics;
6: using System.Web;
7: using System.Web.Services;
8: using System.EnterpriseServices;
9:
10: namespace Sample011
11: {
12: /// <summary>
13: /// Service1 の概要の説明です。
14: /// </summary>
15: [WebService(Namespace="http://www.atmarkit.co.jp/example/namespace",
16: Description="C#のアトリビュートを解説するためのサンプル",
17: Name="A Sample Web Service" )]
18: public class Service1 : System.Web.Services.WebService
19: {
20: public Service1()
21: {
22: //CODEGEN: この呼び出しは、ASP.NET Web サービス デザイナで必要です。
23: InitializeComponent();
24: }
25:
26: ... Component Designer generated code ...
27:
28: [WebMethod(BufferResponse=false,CacheDuration=60,
29: Description="WebMethodアトリビュートの解説用のメソッド",Enable Session=false,
30: MessageName="SampleMethod",
31: TransactionOption=TransactionOption.Supported)]
32: public string HelloWorld()
33: {
34: return "Hello World";
35: }
36: }
37: }
List 20-11をVisual Studio .NETから実行するとInternet Explorerが立ち上がり、Fig.20-12のような情報が表示される。
SampleMethodリンクをクリックすれば、Fig.20-13のように詳細を知ることができる。
テストのため、[起動]ボタンを押すとFig.20-14のようになる。
まず名前空間を指定するコードから説明しよう。名前空間を指定するには、15行目のようにWebService属性を記述する。これはクラスに付く属性なので、18行目のクラス宣言の手前に記述されている。Namespaceは名前空間のURIを指定する。そのほかに、幾つかの名前付きパラメータを記述してみた。Descriptionはそのサービスの説明文を記述する。Nameはそのサービスの名前を記述する。
28行目のWebMethod属性にも、オプションの名前付きパラメータを充実させてみた。BufferResponseはレスポンスをバッファリングするかどうかを指定する。サイズの大きなレスポンスはバッファリングしない方が効率がよいらしい。CacheDurationはキャッシュが有効な時間を秒単位で指定する。Descriptionはメソッドの説明を記述する。EnableSessionはセッション管理を有効にするかどうかを指定する。MessageNameは送受信されるメッセージの名前を指定する。Fig.20-12を見て分かるとおり、外部からはこの名前のメソッドが存在するかのように見える。TransactionOptionはトランザクションを使用するかどうかを指定する。
このように、多くの機能が名前付きパラメータとして用意されているので、その気になれば、かなりきめ細かく動作をコントロールできる。しかも、同じソース・コード上にコードと指定をすべていっしょに記述できるため扱いやすい。これも属性という機能のおかげであろう。
なお、TransactionOptionの値のみSystem.Web.Services名前空間ではなく、System.EnterpriseServices名前空間上にあるようだ。そのため、8行目のusingが追加されている点に注意されたい。
『新プログラミング環境 C#がわかる+使える』
本記事は、(株)技術評論社が発行する書籍『新プログラミング環境 C#がわかる+使える』から許可を得て一部分を転載したものです。
【本連載と書籍の関係について 】
この書籍は、本フォーラムで連載した「C#入門」を大幅に加筆修正し、発行されたものです。連載時はベータ版のVS.NETをベースとしていましたが、書籍ではVS.NET製品版を使ってプログラムの検証などが実施されています。技術評論社、および著者である川俣晶氏のご好意により、書籍の内容を本フォーラムの連載記事として掲載させていただけることになりました。
→技術評論社の解説ページ
ご注文はこちらから
Copyright© Digital Advantage Corp. All Rights Reserved.