次の方法で共有


ASP.NET を使用した Web サービス

 

Rob Howard
Microsoft Corporation

2001 年 2 月 22 日

Web サービスは、Microsoft の .NET 戦略の基盤となります。 このイニシアチブの背後にある概念とイノベーションは、開発者が次世代のインターネット アプリケーションを構築する際に大きな打撃を受けています。

今月の列では、Web サービスを有効にするために、ASP.NET 内の機能を確認します。 技術的な詳細を確認する前に、Web サービスの概要から始めましょう。

Web サービスの概要

Web サービスは、標準の Web プロトコルを介してアクセスできるプログラム可能なアプリケーション ロジックです。 これらの Web プロトコルの 1 つは、Simple Object Access Protocol (SOAP) です。 SOAP は、標準ベースのテクノロジ (データ記述用の XML とトランスポート用の HTTP) を使用してアプリケーション データをエンコードおよび送信する W3C 送信ノート (2000 年 5 月時点) です。

Web サービスのコンシューマーは、サービスの実装に使用されるプラットフォーム、オブジェクト モデル、またはプログラミング言語について何も知る必要はありません。SOAP メッセージ (HTTP および XML) を送受信する方法を理解するだけで済みます。

Soap メッセージ

SOAP メッセージは、いくつかの要素 (特にエンベロープ) で構成されます。 エンベロープは、SOAP メッセージ内で送信されるデータをカプセル化します。 HTTP ヘッダーを含む単純な SOAP メッセージを次に示します。

POST /demo/MSDN/PerfCounter.asmx HTTP/1.1
Connection: Keep-Alive
Content-Length: 150
Content-Type: text/xml
Host: localhost
User-Agent: MS Web Services Client Protocol 1.0.2204.19
SOAPAction: "http://tempuri.org/PerfCounters"

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/" 
               xmlns:soapenc="https://schemas.xmlsoap.org/soap/encoding/" 
               xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" 
               xmlns:xsd="http://www.w3.org/1999/XMLSchema">
  <soap:Body>
    <PerfCounters xmlns="http://tempuri.org/"/>
  </soap:Body>
</soap:Envelope>

上記の例では、要求の HTTP ヘッダーが表示されます。HTTP SOAPAction ヘッダーは、必要に応じて SOAP メッセージをルーティングするためにサーバーによって使用されます。 HTTP ヘッダーの後に、HTTP メッセージの本文が見つかります。 HTTP メッセージの本文は、ビルドする PerfCounters Web サービスの SOAP 要求です。

残念ながら、この列には SOAP の詳細について説明するのに十分なスペースがありません。 SOAP の詳細については、 SOAP 開発者向けリソースに関するページを参照してください。 ここでは、SOAP 1.1 のパブリック仕様と、記事やその他の関連リソースを確認できます。

ASP.NET Web サービス

Web サービスはシンプルでわかりやすいものです。 実際には、SOAP 仕様に準拠した XML としてデータを表示する単純なアプリケーションを作成できます。 また、HTTP 経由で SOAP メッセージを受信し、その中から意味のある値を導き出すことができるアプリケーションを構築することも比較的簡単です。 PERL に慣れているユーザーにとって、これは単に RegEx を使用して XML 結果から値を解析する問題である可能性があります。それは単なる別の文字列です。

ただし、ASP や ASP.NET などのフレームワークを使用して Web アプリケーションを構築するのと同様に、Web サービスを構築するためのフレームワークを使用することをおめします。 推論は非常に論理的です。 プラミングを再発明する必要はありません。つまり、データを XML としてシリアル化し、HTTP を使用してデータを転送し、XML を意味のあるデータに逆シリアル化する機能です。 代わりに、Web サービスの構築を容易にするフレームワークが必要です。これにより、プラミングではなくアプリケーション ロジックに集中できます。 ASP.NET は、このフレームワークを提供します。

開発者の観点から見ると、アプリケーション ロジックを記述したことがあれば、Web サービスを作成するために必要なスキル ASP.NET 持っています。 さらに重要なのは、ASP または ASP.NET アプリケーション サービス (アプリケーション状態メモリなど) に慣れている場合は、Web サービス ASP.NET 構築するときにこれらのスキルを活用することもできます。

公開

例として、Web アプリケーションのパフォーマンス カウンターを公開する Web サービスを記述します。 パフォーマンス カウンターには、アクティブなセッションの数や、提供された要求の数など、アプリケーションの動作に関する詳細が表示されます。 Web サーバーへのローカル サーバー アクセスが常に存在するとは限りません。サーバーのファームがある場合は、これらすべてのサーバーからパフォーマンス カウンターを公開し、それらを中央の場所に集約することをお勧めします。

簡単な例から始める

パフォーマンス カウンターの例に直接取り組むのではなく、いくつかの非常に単純なアプリケーション ロジックから始めて、ロジックを Web サービスとして公開するために何を行う必要があるかを確認してみましょう。 2 つの整数を受け取り、その合計を返す Add() メソッドを使用します。 この単純な Visual Basic ロジックを次に示します。

Public Class MyMath
  Public Function Add(a As Integer, b As Integer) As Integer
    Return a + b
  End Function
End Class

このクラスとそのメソッドを次のように使用できます。

Dim mymath As new MyMath
Dim result As Integer
result = mymath.Add(10, 20)

上記のクラス である を ASP.NET Web サービスとして公開するには、 MyMathアプリケーション ロジックを *.asmx ファイルに移動する必要があります。 ASP.NET Pages に拡張子 *.aspx を使用するのと同様に、*.asmx を使用して、ファイルが ASP.NET Web サービスであることを ASP.NET に伝えます。

*.asmx ソース ファイルを作成し、アプリケーション ロジックを追加した後、いくつかの小さな変更を行う必要があります。

<%@ WebService Language="VB" Class="MyMath" %>
Public Class MyMath
  Public Function <WebMethod()>Add(a As Integer, b As Integer) As Integer
    Return a + b
  End Function
End Class

ソースの変更

*.asmx ファイルに加えた変更には、 と Web サービスとして公開している の両方LanguageClassを指定する WebService ディレクティブの追加が含まれます。 WebService ディレクティブは、アプリケーション ロジックを含むクラス ASP.NET 指示する必要があります。 次に、Add() 関数宣言に <WebMethod()> 属性を追加しました。 属性は宣言型のコード要素であり、必ずしもより多くのコードを記述することなく、アプリケーション ロジックの動作を変更できます。 WebMethod()> 属性の<場合、これは、この属性を持つメソッドが 'Web 呼び出し可能' として扱われることを ASP.NET に指示します。 このメソッドが SOAP をサポートするために必要な作業を ASP.NET という意味で Web 呼び出し可能です。

アプリケーション ロジックを Web 呼び出し可能として有効にするために何を行う必要があるかを確認したので、より関連性の高いサンプルを見てみましょう。

パフォーマンス カウンター Web サービス

次に示すアプリケーション ロジックは、ASP.NET® Web サービスの変更と共に Windows パフォーマンス カウンターにアクセスできるようにします。 作成したファイルは PerfCounter.asmx です。

<%@ WebService language="VB" class="PerfCounters" %>
Imports System.Xml.Serialization
Imports System.Web.Services
Imports System.Diagnostics
 
Public Class PerfCounters
  Inherits WebService
 
  ' Returns a Counter class
  Public Function <WebMethod()>GetCounters() As Counters
    Dim c As new Counters
 
    ' Application Name
    c.ApplicationName              = IISAppName
 
    ' System specific
    c.WorkerProcessRestarts = Poll(0, "Worker Process Restarts")
    c.WorkerProcessRunning  = Poll(0, "Worker Process Running")
    c.ApplicationsRunning   = Poll(0, "Applications Running")
    c.RequestsQueued        = Poll(0, "Requests Queued")
 
    ' Application Specific
    c.RequestsTotal         = Poll(1, "Requests Total")     
    c.RequestsFailed        = Poll(1, "Requests Failed")   
    c.RequestsSucceeded     = Poll(1, "Requests Succeeded")
    c.ActiveSessions        = Poll(1, "Sessions Active")
 
    Return c
  End Function
 
  Private Function Poll(counterType As Integer, counter As String) As Integer
     Dim PerfCounter As PerformanceCounter
 
     If (counterType = 0)
       PerfCounter = new PerformanceCounter("ASP Plus System", counter, "")
     Else
       PerfCounter = new PerformanceCounter("ASP Plus Applications", counter, IISAppName)
     End If
 
     Return PerfCounter.NextValue().ToInt32()
  End Function
 
  Private Function IISAppName() As String
    Dim AppName As String
    
    AppName = Context.Request.ServerVariables("APPL_MD_PATH")
    AppName = AppName.Replace("/"C, "_"C)
 
    Return AppName
  End Function
End Class
 
Public Class Counters
  Public ApplicationName As String
  Public WorkerProcessRestarts As Integer
  Public WorkerProcessRunning As Integer
  Public ApplicationsRunning As Integer
  Public RequestsQueued As Integer
  Public RequestsTotal As Integer
  Public RequestsFailed As Integer
  Public RequestsSucceeded As Integer
  Public ActiveSessions As Integer
End Class

ここでも、言語と クラスの両方を示す WebService ディレクティブがファイルの先頭に宣言されていることがわかります。 Web 呼び出し可能メソッドを含むクラスは PerfCounters ですPerfCounters 内には、WebMethod() 属性を持つ< 1 つのメソッド GetCounters()があります> GetCounters() は 、別のクラス Counters のインスタンスを返 します

GetCounters()を呼び出すと、 メソッドは Counter クラスの新しいインスタンスを作成し、パブリック メンバーの設定を開始します。これらのパブリックメンバーはプロパティとして実装する必要がありますが、私は記事の目的のためにスペースを節約することを選択しました。

Counter クラスのメンバーが設定されると、プライベート メソッド Poll() の呼び出しによって返された結果で設定されます。 Poll() は、システム パフォーマンス カウンターをポーリングして結果を返す実際の作業を行います。

最後に、最後のメソッド IISAppName() はサーバー変数 APPL_MD_PATHの値を返し、'/' 文字を '_' 文字に置き換えます。この値は、パフォーマンス カウンター内のアプリケーション名として使用されます。

サービスを構築したので、それをテストする方法を見てみましょう。

Web サービスのテスト

この ASP.NET Web サービスを作成したので、どのようにテストしますか? Web サービスのコンシューマーはもう 1 つのアプリケーションですが、ASP.NET は、テストやドキュメントの目的で使用できる Web サービスへの簡単なブラウザー インターフェイスを提供します。

サービスは Web サーバーから利用可能なリソースとして公開されているため、ブラウザーを開いてそのリソースに対して要求を行うだけです。 これにより、HTML ベースの Web サービスに関する優れたヘルプ ページが提供されます。これにより、ユーザーはサービスが提供する内容について学習できます。

図 1. HTML ベースの Web サービスのヘルプ ページ

ASP.NET は上記のページを生成し、それを使用してサービスをテストし (GetCounters Web メソッド セクションの HTML 呼び出しボタンに注意してください)、サービスが提供するものを説明するために使用される XML コントラクト言語にアクセスできます。XML コントラクト言語にすぐに戻ります。

[呼び出し] ボタンを押すと、新しいブラウザー ウィンドウが開き、HTTP-Get を使用してサービスに要求が行われます。ASP.NET Web サービスで使用される 3 つのプロトコルのうちの 1 つ。

図 2. [呼び出し] ボタンを押したときに作成される新しいブラウザー ウィンドウの例。

返される XML は、Counters クラスで識別したすべての設定を記述する有効な XML ドキュメントです。 ただし、SOAP ではありません。 SOAP は、アプリケーション間通信を行うときに使用される既定のプロトコルです。

この記事では説明しませんでしたが、ヘルプ ページを大幅にカスタマイズできます。 これを行うには、ASP.NET 構成システムにいくつかの変更を加えるか、DefaultSDLHelpGenerator.aspx を変更します。 これはすべての Web サービスに使用されるテンプレートであるため、DefaultSDLHelpGenerator.aspx を変更しないことをお勧めします。 代わりに、コピーを作成し、それを使用するアプリケーションの構成でコピーしたバージョンを参照します。

Web サービスの作成とテストについて説明したので、それを利用しましょう。

消費

Web サービスを使用するには、いくつかのオプションがあります。 この記事は ASP.NET に関する記事であるため、Web サービスを使用できる .NET テクノロジに焦点を当てます。 ただし、SOAP を理解しているプラットフォームまたはフレームワークは、Web サービスと通信できる必要があることを指摘する必要があります。 ASP.NET を使用して Web サービスを構築しても、サービスが他の Microsoft アプリケーションでのみ使用できるわけではありません。

Web サービスのコンシューマーは、サービスが提供する内容 (Web 呼び出し可能メソッドの外観など) を把握する必要があります。 したがって、すべての Web サービスは、必要に応じて別の共通 XML ドキュメント (コントラクト) を共有します (注:ASP.NET で構築された Web サービスには、常に自動的にコントラクトが提供されます)。

コントラクト

上記の例では、Web サービスのテストについて説明しましたが、Web サービス ヘルプ ページの SDL Contract 内にあるリンクについては説明しませんでした。 そのリンクに従う場合は、 GetCounters() Web メソッドの [呼び出し] ボタンを押す代わりに、次の XML ドキュメントが表示されます。

図 3: Web サービス ヘルプ ページ内のリンクに従うときに表示される XML ドキュメント

この XML ドキュメントは、Web サービスについて説明するコントラクトです。 サポートされているプロトコルと、値を呼び出して返すためのセマンティクスについて詳しく説明します。 さらに、 Counters クラスの XML スキーマも定義します。

ツールはこの XML スキーマを使用して、Web サービスのプロキシ クラスを構築できます。 プロキシ クラスは、ローカル オブジェクトのように見えるクラスですが、実際には、メソッド要求を SOAP エンドポイントにシリアル化、送信、受信、および逆シリアル化する作業を行っています。

メモ .NET のベータ 1 では、"SDL - サービス記述言語" コントラクトが表示されます。ベータ 2 では、より新しい "WSDL— Web サービス記述言語" コントラクトを使用するように切り替わります。 意味的には大きく異なります。 WSDL は、XML コントラクト言語をより適切に標準化するための Microsoft、IBM、およびその他の複数の企業の共同作業です。

Web サービスを使用するためのさまざまなオプションがありますが、特に次の 3 つを呼び出したいと思います。

  • Visual Studio .NET: —Visual Studio .NET は、SDL または WSDL からプロキシを作成する作業を行い、適切なコードをプロジェクトに追加します。 これは、単に [プロジェクト] |Web 参照。次に、有効なコントラクトを指します。 ベータ 1 の場合、コントラクトは SDL である必要があることに注意してください。
  • コマンド ライン ツール: —.NET SDK には、SDL コントラクトを受け入れ、Visual Basic .NET、C#、または JScript.NET のプロキシ ソース コードを生成できる WebServiceUtil.exe というツールが付属しています。
  • IE 5.5。 動作: —SOAP エンドポイントとのクライアントの豊富な対話を可能にするブラウザー固有の動作。 リモート スクリプティングに精通しているユーザーには、これが大好きです。 IE 5.5 の動作の詳細については、「 WebService の動作」を参照してください。

残念ながら、これら 3 つのオプションについて詳しく説明するスペースはありません。 しかし、これは.NETをインストールした人に適用されるため、コマンドラインツールを使用してプロキシを構築することは簡単に説明する価値があると思いました。Visual Studio .NET を持つものだけではありません。

コマンド ライン ツール

.NET には、Visual Studio .NET または .NET SDK の一部としてインストールする場合でも、WebServiceUtil.exeと呼ばれるコマンド ライン プロキシ生成ツールが含まれています。 このコマンド ライン ツールへのパスと他のいくつかのコマンド ライン ツールは、.NET のインストール時にパスに追加されます。

WebServiceUtil.exeでは、SDL またはコントラクトにコマンド ライン引数の 1 つとして名前を付けることができ、ツールは Web サービスへのプロキシのソース コードを生成できます。

たとえば、PerfCounters.asmx の例から SDL を保存する場合は、WebServiceUtil.exeを使用して、この Web サービスに対する Visual Basic .NET プロキシを生成できます。

WebServiceUtil.exe /command:proxy PerfCounter.sdl /language:VB

これにより、コンパイルする必要があるソース ファイル PerfCounters.vb が生成されます。

VB.NET コマンド ライン コンパイラを使用vbc.exe、VB ソース ファイルをコンパイルできます。

vbc /t:library /r:system.web.dll /r:system.web.services.dll /r:system.xml.serialization.dll perfcounters.vb

コマンド ライン コンパイラで行ったことは、実行可能ファイル (exe) ではなくライブラリ (dll) を作成することを指定することです。また、コンパイルするソース ファイルに名前を付けるだけでなく、いくつかの .NET アセンブリ (ソース ファイルに必要なクラスを含むライブラリ) をコンパイラの引数として指定しました。

結果は PerfCounters.dll、PerfCounters.asmx ASP.NET Web サービスへの完全なプロキシであり、.NET アプリケーションで使用して SOAP 経由で Web サービスに通信できるようになりました。

このプロキシを使用して、Web サービスを使用して使用する単純な ASP.NET ページを作成しましょう。

Web サービスの使用

まず、コンパイル済みプロキシ (アセンブリと呼ばれます) を Web アプリケーションの \bin ディレクトリにデプロイする必要があります。 この列にコンパイル済みコードを配置する (将来の列のもう 1 つのトピック) については説明していませんが、システム上のアセンブリを "登録" するには、*.dllを Web アプリケーションの \bin ディレクトリにコピーするだけで十分です。 これは .NET の機能ですが、\bin ディレクトリの使用は ASP.NET に固有です。

簡単にするために、たとえば、サーバーのルート ディレクトリ c:\inetpub\wwwroot\bin から bin ディレクトリを作成します。 \bin ディレクトリは、アプリケーション ルート (Web のルートまたは IIS のアプリケーションとしてマークされたフォルダー) に存在する必要があります。

次に、アセンブリ PerfCounters.dllを \bin ディレクトリにコピーします。 これで、c:\inetpub\wwwroot にデプロイする ASP.NET ページを作成できるようになりました。 これを PerfCountersConsume.aspx と呼びます。

<Script runat="server">
  Public Sub Page_Load(sender As Object, e As EventArgs)
    Dim perfcounters As New PerfCounters
    Dim counters As Counters

    counters = perfcounters.GetCounters()

    webapp.InnerHtml = counters.ApplicationName
    restarts.InnerHtml = counters.WorkerProcessRestarts.ToString()
    procrunning.InnerHtml = counters.WorkerProcessRunning.ToString()
    apprunning.InnerHtml = counters.ApplicationsRunning.ToString()
    queued.InnerHtml = counters.RequestsQueued.ToString()
    totalrequests.InnerHtml = counters.RequestsTotal.ToString()
    failedrequests.InnerHtml = counters.RequestsFailed.ToString()
    succeededrequests.InnerHtml = counters.RequestsSucceeded.ToString()
    activesessions.InnerHtml = counters.ActiveSessions.ToString()
  End Sub
</Script>
Web Application: <B id="webapp" runat="server"/><BR>
Process Restarts: <B id="restarts" runat="server"/><BR>
Processes Running: <B id="procrunning" runat="server"/><BR>
Applications Running: <B id="apprunning" runat="server"/><BR>
Requests Queued: <B id="queued" runat="server"/><BR>
Requests Total: <B id="totalrequests" runat="server"/><BR>
Requests Failed: <B id="failedrequests" runat="server"/><BR>
Requests Succeeded: <B id="succeededrequests" runat="server"/><BR>
Active Sessions: <B id="activesessions" runat="server"/><BR>

上記のコードでは、プロキシ クラス PerfCounters のインスタンスを作成します (\bin ディレクトリに登録されているアセンブリであるため、使用できます)、 GetCounters() メソッドを呼び出し、 Counters クラスのインスタンスを返します。 その後、 Counters クラスのカウンターのインスタンスを使用してメンバー変数を要求し、サーバー コントロール ASP.NET 設定します。 結果は次のとおりです。

図 4: ASP.NET サーバー コントロール

まとめ

この列では、ASP.NET Web サービスの概要について説明します。 セキュリティ、セッション状態の使用、拡張機能など、私たちが光沢を付けたか、まったくカバーしていなかった詳細が非常に多くあります。 来月の列では、ASP.NET Web サービスの要求/応答を追跡できる属性の構築に使用できる、ASP.NET Web サービスのより高度な機能 (拡張機能) について説明します。

Rob Howard は、.NET Framework チームの ASP.NET プログラム マネージャーです。 彼は彼の家族と一緒に持っているか、東ワシントンでフライフィッシングを持っている任意の空き時間を過ごします。