Microsoft .NET および Windows XP COM+ と SOAP の統合

 

Scott Seely
Microsoft Developer Network

2001 年 10 月

概要:この記事では、Microsoft Windows XP と.NET Frameworkを使用して、SOAP 経由で既存の COM+ アプリケーションを公開する方法について説明します。 付属のダウンロード可能なアプリケーションを使用すると、記事に従って、自分のマシンで同じアクションを実行できます。 (8ページ印刷)

サンプルをダウンロードするには、ここをクリックしてください

内容

はじめに
元の COM+ アプリケーション
印刷サービス
クライアント アプリケーション
まとめ

はじめに

Microsoft® Windows XP と Microsoft .NET では、Windows プラットフォーム用に多くの優れた新機能が導入されています。 この記事では、SOAP 経由で既存の COM+ アプリケーションを公開する機能の 1 つについて説明します。 このしくみを示すために、次のシナリオを考え出しました。

インターネット インフォメーション サービス (IIS) がインストールされている Windows XP システムでは、ユーザーが \\My Photos ディレクトリに格納されている写真にアクセスできる COM+ アプリケーションが実行されています。 SOAP 統合を利用するために、コンピューターの所有者は、.NET Frameworkをインストールし、SOAP 経由で COM+ アプリケーションを公開します。 C# で記述されたもう 1 つの Web サービスは、ユーザーが用紙に印刷する画像を送信する機能を提供します。 ユーザーが自分のイメージを表示、管理、および印刷できるようにするために、すべてを 1 つのまとまりのある部分にまとめるクライアント アプリケーションが作成されます。

このすべてが動作していることを確認できるように、記事に従って自分のコンピューターで同じアクションを実行できるアプリケーションを作成しました。 読み続ける前に、 サンプルをダウンロード して今すぐインストールすることをお勧めします。 この例を実行するには、IIS と.NET Frameworkで Windows XP Professional を構成する必要があります。

元の COM+ アプリケーション

元の COM+ アプリケーションは PictureApplication と呼ばれます。 これには、1 つの COM オブジェクト ImageRetriever が含まれています。 正しく設定すると、この COM+ アプリケーションは特定のユーザーの ID で実行されます。 その ID を使用して、アプリケーションはユーザーの特別なフォルダーにアクセスできます。 COM オブジェクトは、これを使用して My Pictures フォルダーにアクセスします。 このオブジェクトは、次の 3 つの関数を公開します。

  • **GetImageNames
    **マイ ピクチャ フォルダー内のすべてのイメージ ファイルの一覧を返します。
  • **GetImageByName
    **画像ファイルの名前を指定すると、この関数はファイルをバイト配列として返します。
  • **SaveImage
    **バイト配列とファイル名を指定すると、この関数は、渡されたファイル名を使用して、バイトの配列をファイルとして My Pictures フォルダーに保存します。

オブジェクトを SOAP エンドポイントとして公開するには、COM+ アプリケーションと.NET Frameworkを Windows XP システムにインストールする必要があります。 これらの要件が満たされると、オブジェクトを実際に公開するのは非常に簡単です。

  1. Component Services コンソール内から、 PictureApplication という名前の COM+ アプリケーションに移動します。

  2. [PictureApplication] ノードを右クリックし、[プロパティ] を選択します

  3. PictureApplication プロパティ シート内で、[アクティブ化] タブをクリックします。

  4. 以前のバージョンの COM+ とは異なり、[ アクティブ化 ] タブには SOAP という名前のグループ ボックスが含まれています。 この COM+ アプリケーションへの SOAP アクセスを有効にするには、[SOAP チェックを使用する] ボックスをクリックし、SOAP VRoot の名前を入力します。 この仮想ルート ディレクトリは IIS 内に作成され、SOAP エンドポイントをホストします。 このアプリケーションのプロパティ ページを図 1 に示します。

    図 1. 新しい COM+ アクティブ化プロパティ ページ

  5. この特定のアプリケーションでは、仮想ルート ディレクトリの名前は WinXPPhotos です。 サンプルと共にフォローしている場合は、同じ名前を使用して、アプリケーションをアンインストールすると仮想ルートが削除されるようにします。 [OK] または [適用] をクリックすると、%WINDOWS%\System32\COM\SOAPVRoots\WinXPPhotos ディレクトリに .NET 相互運用機能アセンブリが自動的に作成され、このディレクトリが IIS にマップされます。 他のいくつかのファイルも作成されます。

    • **Default.htm
      **default.disco にリンクする空の HTML ファイル。
    • **Default.disco
      **Web サービス記述言語 (WSDL) ファイルの相対 URL を一覧表示します。 PictureApplication の場合、PictureProject.ImageRetriever.soap ですか?Wsdl。
    • **Web.config
      **Web サービスの構成ファイル。 ファイルには 、.NET リモート処理に特有の情報が含まれています。
    • **Bin\[相互運用機能アセンブリ]
      **COM+ アプリケーションがアンマネージ コードを使用して記述されている場合は、COM+ アプリケーションの .NET ラッパーが含まれます。 元のアプリケーションは従来の COM を使用し、Microsoft Visual Basic® 6.0 でビルドされているため、このディレクトリには PictureProject.DLL という名前のファイルが存在します。 このコンポーネントがマネージド コードを使用して記述された場合は、グローバル アセンブリ キャッシュ (GAC) に配置され、このディレクトリにファイルは存在しません。

これらのファイルを使用すると、SOAP を使用してアプリケーションを使用する準備が整いました。

印刷サービス

このすべてに含まれるもう 1 つのエンティティは、Print サービスです。 内部で ASP.NET を使用し、 PrintImage という 1 つのメソッドを使用します。このメソッドは、単に base64 でエンコードされたバイト配列としてファイルを受け取り、それらのバイトをプリンターを介したフレーミングに適したイメージに変換します。

クライアント アプリケーション

クライアント アプリケーションは、すべてを結び付けます。 まず、C# Windows フォーム アプリケーションを作成しました。 このアプリケーションには、印刷サービスと PictureApplication Web サービスへの参照を追加する必要がありました。 印刷サービスは ASP.NET を使用して作成されたため、Microsoft Visual Studio® .NET 統合開発環境 (IDE) を使用して Web 参照を追加しました。 これを行うには、[ProjectAdd Web Reference]\(Web 参照の追加\ \ ) に移動し、Photo サービスを追加します。 PictureApplication Web サービスでは、処理がもう少し難しくなります。 .NET リモート処理を使用する Web サービスを参照する場合は、soapsuds ユーティリティを使用する必要があります。 コマンド ラインから、次のコマンドを発行します。

soapsuds -url:https://localhost/WinXPPhotos/PictureProject.ImageRetriever.soap?WSDL –gc

このコマンドは、プロジェクトに追加する必要がある PictureProject.cs という名前のファイルを生成します。 ファイルを追加するには、[ プロジェクト]、[ 既存のファイルの追加]、[ PictureProject.cs] の順に選択します。 これで、プロジェクト内の 2 つの Web サービスへの参照が作成されました。 Visual Studio .NET IDE では .NET リモート処理 DLL への参照が自動的に追加されないため、その参照も追加する必要があります。

そのすべてを整えて、さまざまなサービスにアクセスするためのユーザー インターフェイスを追加する必要がありました。 アプリケーションを初めて開くと、次の画面が表示されます。

図 2. クライアント アプリケーションの開く画面

ご覧のように、サーバーからイメージを取得し、イメージをサーバーに追加して、現在のイメージを印刷します。 [ サーバーからイメージを取得] を選択すると、次のダイアログ ボックスが表示されます。

図 3: [PickImage]\(イメージの選択\) ダイアログ ボックス

PickImage ダイアログ ボックスは、サーバー上のすべてのイメージを要求する SOAP メッセージを COM+ アプリケーションに送信します。 交換自体は次のようになります。

Request

<SOAP-ENV:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:SOAP-ENC="https://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/" 
    SOAP-ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:i2=
"https://schemas.microsoft.com/clr/nsassem/PictureProject._ImageRetriever/PhotoClient">
    <SOAP-ENV:Body>
        <i2:GetImageNames id="ref-1">
        </i2:GetImageNames>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Response

<SOAP-ENV:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:SOAP-ENC="https://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:SOAP-ENV="https://schemas.xmlsoap.org/soap/envelope/" 
    SOAP-ENV:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:i2="https://schemas.microsoft.com/clr/nsassem/PictureProject.
      _ImageRetriever/PictureProject">
    <SOAP-ENV:Body>
        <i2:GetImageNamesResponse id="ref-1">
            <return href="#ref-3"/>
        </i2:GetImageNamesResponse>
        <SOAP-ENC:Array id="ref-3" SOAP-ENC:arrayType="xsd:string[26]">
            <item id="ref-4">27395356.jpg</item>
            <item id="ref-5">27395357.jpg</item>
            <item id="ref-6">27395382.jpg</item>
            <item id="ref-7">27395387.jpg</item>
            <item id="ref-8">27395401.jpg</item>
            <item id="ref-9">27395408.jpg</item>
            <item id="ref-10">fig2.bmp</item>
            <item id="ref-11">FIGURE 1-1.GIF</item>
            <item id="ref-12">FIGURE 1-6.gif</item>
            <item id="ref-13">FIGURE 10-1.gif</item>
            <item id="ref-14">FIGURE 13-1.gif</item>
            <item id="ref-15">FIGURE 13-2.gif</item>
            <item id="ref-16">FIGURE 13-3.gif</item>
            <item id="ref-17">FIGURE 13-4.gif</item>
            <item id="ref-18">FIGURE 6-1.gif</item>
            <item id="ref-19">FIGURE 9-1.gif</item>
            <item id="ref-20">FIGURE 9-2.gif</item>
            <item id="ref-21">headboard.TIF</item>
            <item id="ref-22">kinkos.GIF</item>
            <item id="ref-23">kodak.GIF</item>
            <item id="ref-24">LEAF.BMP</item>
            <item id="ref-25">msnet.GIF</item>
            <item id="ref-26">nwa.bmp</item>
            <item id="ref-27">nwa.gif</item>
            <item id="ref-28">PLUS.BMP</item>
            <item id="ref-29">soap.bmp</item>
        </SOAP-ENC:Array>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

ご覧のように、アプリケーションでは非常に基本的な SOAP メッセージを使用してやり取りしています。 他のメッセージは、完全な base64 でエンコードされたイメージを送信するため、かなり長くなります。 ユーザーがイメージ名をダブルクリックするか、イメージを選択して [OK] をクリックすると、クライアント アプリケーションは SOAP 要求をサーバーに送信し、特定のイメージを要求します。 サーバーは、そのファイルの生ビットを送信して応答します。 .NET グラフィックス ライブラリにはいくつかの優れた点があるため、コードはこれらの生のバイトのみを受け取り、フォームにイメージを表示します。 図 4 は、このような要求の 1 つ後に表示される画像を示しています。

図 4: Picture Client displaying picture of my daughter, Angeline, and my wife, Jean

ユーザーが [メイン] メニューから [イメージの印刷] を選択すると、クライアント アプリケーションはイメージからバイトを取得し、印刷サービスに発送します。 図 5 に示す PickPrinteService ダイアログ ボックスを使用すると、ユーザーは印刷サービスを選択できます。 表示されている 3 つのうち、Microsoft .NET オプションのみがアクティブです。 他の 2 つのコダックとキンコスは、説明のみを目的としています。 印刷サービスは、画像を受け取ると、画面に画像を描画するために示したコードと同様の処理を行います。 もちろん、このコードでは画像を紙に書きますが、それほど変わっていません。

図 5: [PickPrintService] ダイアログ ボックス

まとめ

この例では、Windows XP と.NET Frameworkを使用して画像ストレージ COM+ アプリケーションを公開する方法を示します。 また、Web サービスを使用して大量のバイナリ データを転送する方法も示します。 Windows XP と.NET Frameworkを使用すると、既存の COM+ アプリケーションを SOAP エンドポイントとして簡単に公開できます。 作業の大部分には、コンポーネント サービス コンソール内からボックスをチェックし、仮想ディレクトリの名前付けの入力が含まれます。 その後、エンドポイントの使用は、他の SOAP エンドポイントの使用と同じように動作します。