┏第76号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ──<メニュー>─────────────────────── ■.NET Tips ・Webサービスを作成する ─────────────────────────────── ─────────────────────────────── ■.NET Tips ─────────────────────────────── ●Webサービスを作成する 今回は、XML Webサービスを作成する方法を説明します。次回はAjax について説明する予定ですので、その準備です。 なおWebサービスの作成法については、MSDNの「ASP.NET を使用した XML Web サービス」などで説明されています。 [URL]ASP.NET を使用した XML Web サービス http://msdn2.microsoft.com/ja-jp/library/ba0z6a33.aspx ★Visual StudioでWebサービスを作成する まずはVisual Studio 2005を使ってWebサービスを作成する方法を順 を追って説明します。Visual Studio .NETでもほぼ同様です。 1.メニューの[ファイル]-[新規作成]-[Webサイト]などにより、「新 しいWebサイト」ダイアログを表示します。 2.「新しいWebサイト」ダイアログで「ASP.NET Webサービス」を選択 し、OKボタンをクリックします。 3.作成されたWebサイトには、「Service.asmx」と「App_Code/ Service.cs」(VB.NETの場合は、「App_Code/Service.vb」)と「web .config」(VB.NETの場合のみ)が作成されています。 「Service.asmx」の中身は、次のようになっています。 VB.NETの場合 <%@ WebService Language="vb" CodeBehind="~/App_Code/Service.vb" Class="Service" %> C#の場合 <%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" Class="Service" %> つまり、コードビハインドとなっており、本体のコードはApp_Codeデ ィレクトリの「Service.cs」や「Service.vb」に記述します。これら のファイルの中身は、初期状態で次のようになっています。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols _ _ _ Public Class Service Inherits System.Web.Services.WebService _ Public Function HelloWorld() As String Return "Hello World" End Function End Class ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class Service : System.Web.Services.WebService { public Service () { //デザインされたコンポーネントを使用する場合、次の行をコメントを解除してください //InitializeComponent(); } [WebMethod] public string HelloWorld() { return "Hello World"; } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 注意:.NET Framework 1.1以下ではWebServiceBindingAttributeと DesignerGeneratedAttributeはサポートされていません。 補足:「別のファイルにコードを書き込む」をオフにしてWebサービ スを作成したときは、作成されたクラスに DesignerGeneratedAttribute属性は適用されません。 4.これですでに立派なWebサービスが作成されています。現時点では、 「http://tempuri.org/」という名前空間の「Service」という名前の Webサービスに、「HelloWorld」というWebサービスメソッドが一つあ るだけです。 5.これに独自のWebサービスメソッドを追加してみましょう。ここで は送信された文字列を大文字に変換して返す「ToUpper」というWebサ ービスメソッドを追加します。HelloWorldメソッドと同様に、 Serviceクラスにプロパティメソッドを追加し、WebMethodAttribute 属性を適用します。 追加するメソッドのコードは次のようなものです。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ _ Public Function ToUpper(ByVal str As String) As String Return str.ToUpper() End Function ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [WebMethod] public string ToUpper(string str) { return str.ToUpper(); } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 6.さらにXML名前空間を独自のものに変更します。ここでは、XML名前 空間を「http://dobon.net/services/」に変更します。XML名前空間 はWebServiceAttribute属性のNamespaceプロパティで変更できます。 Namespaceプロパティを指定しなかった場合は、「http://tempuri. org/」となります。 このようにして変更された「Service.cs」や「Service.vb」は次のよ うになります。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols _ _ _ Public Class Service Inherits System.Web.Services.WebService _ Public Function HelloWorld() As String Return "Hello World" End Function _ Public Function ToUpper(ByVal str As String) As String Return str.ToUpper() End Function End Class ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; [WebService(Namespace = "http://dobon.net/services/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class Service : System.Web.Services.WebService { public Service() { //デザインされたコンポーネントを使用する場合、次の行をコメントを解除してください //InitializeComponent(); } [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public string ToUpper(string str) { return str.ToUpper(); } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 7.Webブラウザで「Service.asmx」のURLを開くと、「サービスヘルプ ページ」と呼ばれるHTMLページが表示されます。このページには、 Webサービスに関する様々な情報が表示されます。 Visual Studioでこのページを表示させるには、F5キーや、ツールバ ーの「デバッグの開始」ボタンを押してデバッグを開始するか、ソリ ューションエクスプローラで「Service.asmx」を右クリックして、コ ンテキストメニューから「ブラウザで表示」を選択します。 サービスヘルプページでは、サポートされているWebサービスメソッ ドの一覧や、それぞれのメソッドの使用可能なプロトコル別の要求と その反応の例を見ることができます。さらに、送信する値を入力して、 HTTP POSTを使用したテストを行うこともできます。 8.このように作成されたWebサービスは、SOAPに対応しています。こ のWebサービスのWSDLは、次のようなURLで取得できます。 http://localhost/Service/Service.asmx?WSDL つまり、ASMXのURLの末尾に「?WSDL」を付加したものとなります。こ のURLへのリンクは、サービスヘルプページの「サービスの説明」の 箇所にあります。 ★Visual Studioを使わずにWebサービスを作成する Visual Studioを使わない場合も、上記で紹介したようなファイルを 自分で用意すれば、全く問題ありません。 前と全く同じでは面白くありませんので、コードビハインドとしない で、ASMXファイルにコードも書いてしまう例を示します。以下の内容 を拡張子が".asmx"のテキストファイルとして保存してください。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ <%@ WebService Language="VB" Class="WebService" %> Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols _ _ Public Class WebService Inherits System.Web.Services.WebService _ Public Function ToUpper(ByVal str As String) As String Return str.ToUpper() End Function End Class ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ <%@ WebService Language="C#" Class="WebService" %> using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; [WebService(Namespace = "http://dobon.net/services/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class WebService : System.Web.Services.WebService { [WebMethod] public string ToUpper(string str) { return str.ToUpper(); } } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 基本的な事柄の説明は以上です。ここからは上記で示したコードに登 場した属性などについて、簡単に説明します。 ★WebServiceAttribute属性 Webサービスを実装したクラスには、WebServiceAttribute属性を適用 します。 WebServiceAttributeのNamespaceプロパティには、XML名前空間を指 定します。省略した場合は、「http://tempuri.org/」となります。 XML名前空間が「http://tempuri.org/」のままだと、サービスヘルプ ページで詳しい説明と共に、名前空間を変更するように勧められます。 WebServiceAttribute.Nameプロパティには、Webサービスの名前を指 定します。省略すると、クラスの名前と同じになります。 WebServiceAttribute.Descriptionプロパティには、Webサービスの説 明を指定することができます。 ★WebServiceBindingAttribute属性 Visual Studio 2005からは、始めに作成されるWebサービスクラスに WebServiceBindingAttribute属性が適用されます。 WebServiceBindingAttributeのConformsToプロパティにWsiProfiles. BasicProfile1_1を指定することにより、WebサービスがWSI Basic Profileバージョン 1.1に準拠していることを示します。 [URL]ASP.NET 2.0 を使用した WS-I Basic Profile 準拠 Web サービ スの構築 http://msdn2.microsoft.com/ja-jp/library/ms230196.aspx ★WebMethodAttribute属性 XML Webサービスメソッドとするメソッドは、パブリックとして、 WebMethodAttribute属性を適用します。 Descriptionプロパティには、メソッドの説明を指定します。 MessageNameプロパティには、Webサービスメソッドに使用される名前 を指定します。このプロパティを使って、Webサービスクラスに同じ メソッド名の複数のオーバーロードが存在する時に、メソッドの名前 を変えることなく、Webサービスメソッドの名前がダブることを防ぐ ことができます。 ☆キャッシュを有効にする WebMethodAttribute.CacheDurationプロパティを使用することにより、 応答のキャッシュを有効にできます。CacheDurationプロパティには、 応答をキャッシュ内に保持する秒数を指定します。キャッシュの保持 期間中は、要求が同じならば、同じ結果を返します。 MSDNには、キャッシュ機能を使う際の注意事項が幾つか示されていま す。まず、キャッシュを有効にすると、要求と応答のデータはメモリ に保存されるため、要求や応答のデータが巨大であったり、要求の変 更幅が大きい場合は、注意が必要です。また、HTTP POSTでは、通常、 キャッシュは行われません。.NET Framework 2.0のサービスヘルプペ ージのテストでは、通常、HTTP POSTが使われているため、キャッシ ュの効果は確認できません。 補足:サービスヘルプページのテストでHTTP GETが使われるようにす るには、Windowsディレクトリの「Microsoft.NET」ディレクトリ以下 にある「CONFIG」ディレクトリ内の「DefaultWsdlHelpGenerator. aspx」ファイルをエディタで開き、 bool showPost = true; を bool showPost = false; に変更します。 さらに、"Cache-Control"が"no-cache"となっているHTTPヘッダが見 つかった場合はキャッシュは無効となります。 ☆セッション状態を保存する Webサービスでも、WebService.Sessionプロパティを使ってセッショ ン状態の保存と取得を行うことができます。ただし、 WebMethodAttribute.EnableSessionプロパティをtrueとしたメソッド でしかセッションは使用できません。 これとは別に、アプリケーション状態の保存と取得を行うWebService .Applicationプロパティも使用できます。これは、EnableSessionプ ロパティに関係なく、使用できます。 ★HTTP GETを有効にする デフォルトでは、作成されたWebサービスは、HTTP SOAPと、要求元が ローカルコンピュータのHTTP POSTのみサポートしています(.NET Framework 1.0では、HTTP GETとPOSTもサポートされています)。 HTTP GETやPOSTをサポートするには、Machine.configまたはWeb. configファイルに要素を追加します。 逆にプロトコルのサポートを無効にするには、要素を使用し ます。 add要素とremove要素のname属性には次のようなオプションがありま す。 HttpSoap:HTTP SOAPのサポートを制御する。デフォルトで有効。 HttpGet:HTTP GETのサポートを制御する。.NET Framework 1.1以上で はデフォルトで無効。 HttpPost:HTTP POSTのサポートを制御する。.NET Framework 1.1以上 ではデフォルトで無効。 HttpPostLocalhost:要求元がローカルコンピュータのHTTP POSTのサ ポートを制御する。デフォルトで有効。 Documentation:サービスヘルプページを表示するか。デフォルトで有 効。 このようにしてHTTP GETを有効にしたWebサービスにアクセスするに は、ASMXファイルのURLの後に「/(メソッド名)」を付けたものを要求 先の基本的なURLとして、この後に「?」とクエリーパラメータを続け ます。クエリーパラメータは「(パラメータ名)=(値)」の形式で、複 数のパラメータは「&」で区切ります。パラメータ名と値は必要に応 じてURLエンコードします。 例えば、Service.asmxのToUpperメソッドをパラメータ値を「abcde」 として呼び出すには、次のようにします。 http://localhost/Service/Service.asmx/ToUpper?str=abcde HTTP POSTの場合も同様に、ASMXファイルのURLの後に「/(メソッド名 )」を付けたものを要求先のURLとして、パラメータを送信します。 ★サービスヘルプページが表示されないようにする ASMXファイルをWebブラウザで開くとサービスヘルプページが表示さ れますが、これを表示されないようにするには、上記と同じように、 要素をMachine.configまたはWeb.configファ イルに追加します。 しかしこれでは、WSDLの生成も無効になります。WSDLを有効にしたま まサービスヘルプページの表示を無効にするには、< wsdlHelpGenerator>要素を使って、ASMXファイルに直接アクセスした 時に別のページが表示されるようにします。 次の例では、デフォルトのサービスヘルプページの代わりにblank. htmlを表示するようにしています。 ★複数のデータを返すWebサービスメソッドを作成する 複数のデータを返すWebサービスメソッドが必要な場合は、それらの データを格納できるクラスや構造体を作成して、メソッドの戻り値の 型として使用するようにします。 ★例外をスローする Webサービスメソッドから例外をスローする場合は、SoapExceptionを スローし、Webサービスメソッドを呼び出したクライアントでも、 SoapExceptionをキャッチします。Webサービスメソッドから SoapException以外の例外がスローされた場合は、SoapExceptionに変 換されて、クライアントにスローされます。 SoapExceptionでは、次のようなプロパティを設定できます。Message プロパティには、例外の説明をするメッセージを指定します。Codeプ ロパティには、SOAP違反コードの種類を指定します。クライアントの 呼び出し方に問題があれば、SoapException.ClientFaultCodeを指定 します。SoapException以外の例外がスローされた場合は、Codeに SoapException.ServerFaultCodeが設定されます。Actorプロパティに は、通常、WebサービスメソッドのURLを指定します。Detailプロパテ ィには、エラーの詳細を設定します。 Webサービスメソッドから例外をスローする例を以下に示します。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ _ Public Function ToUpper(ByVal str As String) As String If str.Length = 0 Then Throw New SoapException("パラメータが空です。", _ SoapException.ClientFaultCode, _ Context.Request.Url.AbsoluteUri) End If Return str.ToUpper() End Function ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ [WebMethod] public string ToUpper(string str) { if (str.Length == 0) { throw new SoapException("パラメータが空です。", SoapException.ClientFaultCode, Context.Request.Url.AbsoluteUri); } return str.ToUpper(); } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 上記の例では、Message、Code、Actorプロパティを設定しています。 Detailも設定してスローする方法は、MSDNの「XML Web サービスでの 例外の処理およびスロー」等をご覧ください。 [URL]XML Web サービスでの例外の処理およびスロー http://msdn2.microsoft.com/ja-jp/library/ds492xtk.aspx ★サンプル 上記のようにして作成したWebサービスのサンプルを下記のURLにおい ておきます。どのように表示されるか等をご確認ください。なおこの Webサービスは2週間ほどで削除されます。(サーバーの環境が英語の ため、英語で表示されます。) [URL]Webサービスのサンプル http://aspspider.net/dobon/WebService.asmx =============================== ■ここで示したコードの多くはまずC#で書き、それを「C# to VB.NET Translator」でVB.NETのコードに変換し、修正を加えたものです。 [URL]C# to VB.NET Translator http://authors.aspalliance.com/aldotnet/examples/translate.aspx ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  (Microsoft MVP for Visual Basic, Oct 2006-Oct 2007)  http://dobon.net  dobon_info@yahoo.co.jp ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/vb/bbs.html ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 - 2006 DOBON! All rights reserved. ===============================