【.NET】 Webサービスを作成する

2007. 11. 21. 15:55

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃          Webサービスを作成する                    ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛


●Webサービスを作成する
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」の中身は、次のようになっている。

<%@ WebService Language="vb" CodeBehind="~/App_Code/Service.vb" Class="Service" %>

つまり、コードビハインドとなっており、本体のコードはApp_Codeデ
ィレクトリの「Service.cs」や「Service.vb」に記述する。これら
のファイルの中身は、初期状態で次のようになっている。

‥‥▽ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols

<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Service
     Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function HelloWorld() As String
        Return "Hello World"
    End Function

End Class
‥‥△ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

注意:.NET Framework 1.1以下ではWebServiceBindingAttributeと
DesignerGeneratedAttributeはサポートされてない。

補足:「別のファイルにコードを書き込む」をオフにしてWebサービ
スを作成したときは、作成されたクラスに
DesignerGeneratedAttribute属性は適用されない。

4.これですでに立派なWebサービスが作成されている。現時点では、
http://tempuri.org/」という名前空間の「Service」という名前の
Webサービスに、「HelloWorld」というWebサービスメソッドが一つあ
るだけ。。。

5.これに独自のWebサービスメソッドを追加してみよう。ここで
は送信された文字列を大文字に変換して返す「ToUpper」というWebサ
ービスメソッドを追加する。HelloWorldメソッドと同様に、
Serviceクラスにプロパティメソッドを追加し、WebMethodAttribute
属性を適用する。

追加するメソッドのコードは次のようなもの。

‥‥ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
<WebMethod()> _
Public Function ToUpper(ByVal str As String) As String
    Return str.ToUpper()
End Function
‥‥ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

6.さらにXML名前空間を独自のものに変更する。ここでは、XML名前
空間を「
http://dobon.net/services/」に変更する。XML名前空間
はWebServiceAttribute属性のNamespaceプロパティで変更できる。
Namespaceプロパティを指定しなかった場合は、「
http://tempuri.
org/」となる。

このようにして変更された「Service.cs」や「Service.vb」は次のよ
うになる。

‥‥▽ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols

<WebService(Namespace:="http://dobon.net/services/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Service
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function HelloWorld() As String
        Return "Hello World"
    End Function

    <WebMethod()> _
    Public Function ToUpper(ByVal str As String) As String
        Return str.ToUpper()
    End Function
End Class
‥‥△ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

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"のテキストファイルとして保存する。

‥‥▽ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
<%@ WebService Language="VB" Class="WebService" %>

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols

<WebService(Namespace:="http://dobon.net/services/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
Public Class WebService
    Inherits System.Web.Services.WebService
   
    <WebMethod()> _
    Public Function ToUpper(ByVal str As String) As String
        Return str.ToUpper()
    End Function
End Class
‥‥△ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

基本的な事柄の説明は以上です。ここからは上記で示したコードに登
場した属性などについて、簡単に説明する。

★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ファイルに<protocols>の<add>要素を追加する。

<configuration>
  <system.web>
    <webServices>
      <protocols>
        <add name="HttpPost"/>
        <add name="HttpGet"/>
      </protocols>
    </webServices>
  </system.web>
</configuration>

逆にプロトコルのサポートを無効にするには、<remove>要素を使用する。

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ブラウザで開くとサービスヘルプページが表示さ
れるが、これを表示されないようにするには、上記と同じように、
<protocols>の<remove>要素をMachine.configまたはWeb.configファ
イルに追加する。

<configuration>
  <system.web>
    <webServices>
      <protocols>
        <remove name="Documentation" />
      </protocols>
    </webServices>
  </system.web>
</configuration>

しかしこれでは、WSDLの生成も無効になる。WSDLを有効にしたま
まサービスヘルプページの表示を無効にするには、<
wsdlHelpGenerator>要素を使って、ASMXファイルに直接アクセスした
時に別のページが表示されるようにする。

次の例では、デフォルトのサービスヘルプページの代わりにblank.
htmlを表示するようにしている。

<configuration>
  <system.web>
    <webServices>
      <wsdlHelpGenerator href="blank.html"/>
    </webServices>
  </system.web>
</configuration>

★複数のデータを返すWebサービスメソッドを作成する

複数のデータを返すWebサービスメソッドが必要な場合は、それらの
データを格納できるクラスや構造体を作成して、メソッドの戻り値の
型として使用するようにする。

★例外をスローする

Webサービスメソッドから例外をスローする場合は、SoapExceptionを
スローし、Webサービスメソッドを呼び出したクライアントでも、
SoapExceptionをキャッチする。Webサービスメソッドから
SoapException以外の例外がスローされた場合は、SoapExceptionに変
換されて、クライアントにスローされる。

SoapExceptionでは、次のようなプロパティを設定できる。Message
プロパティには、例外の説明をするメッセージを指定する。Codeプ
ロパティには、SOAP違反コードの種類を指定する。クライアントの
呼び出し方に問題があれば、SoapException.ClientFaultCodeを指定
する。SoapException以外の例外がスローされた場合は、Codeに
SoapException.ServerFaultCodeが設定される。Actorプロパティに
は、通常、WebサービスメソッドのURLを指定する。Detailプロパテ
ィには、エラーの詳細を設定する。

Webサービスメソッドから例外をスローする例を以下に示する。

‥‥▽ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
<WebMethod()> _
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
‥‥△ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

上記の例では、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

===============================


by artis