チュートリアル:WCF COBOL サービスの作成およびアクセス

COBOL で WCF サービスを作成してアクセスする方法を示します。

概要およびデモンストレーション アプリケーション

本チュートリアルは、この COBOL 開発システムに付属の BookWrapper デモンストレーションに基づいています。BookWrapper は、.NET データ型を COBOL データ型にマッピングする中間プログラムです。その後、既存の COBOL プログラム (book.cbl) を呼び出して、ビジネス ロジックを実行します。

このチュートリアルでは、BookWrapper プログラムの機能を WCF サービスとして公開し、コンソール アプリケーションをクライアントとして使用してそのサービスと通信します。

ここに示すデモンストレーションのより高度なバージョンが製品サンプルに付属しています。コードを確認するには、サンプル ブラウザーを起動し、上部にあるドロップダウン リストから [Show .NET COBOL only] を選択して、[WCF] カテゴリで「WCF Book Service and Client」デモンストレーションを開きます。

前提条件

本チュートリアルを完了するには、次のものが必要です。

  • Visual Studio の Professional、Enterprise、Community Edition などの高度なエディション
  • [WCF ツール] 機能が Visual COBOL にインストールされている必要があります。この機能が欠落している場合は、インストール手順について、「不足している機能を IDE からインストールするには」を参照してください。
  • WinBook サンプルの一部である BookWrapper プロジェクトおよび LegacyBook プロジェクトをビルドしておく必要があります。これを行うには、次の手順を使用します。
    1. サンプル ブラウザーを起動します。手順については、「サンプル ブラウザーを起動するには」を参照してください。
    2. 左側のウィンドウで [Windows Forms] をクリックし、[Win Book] をクリックします。
    3. [Open sample in Visual Studio] をクリックします。
    4. ソリューション エクスプローラーでソリューション WinBook を右クリックして、[ソリューションのビルド] を選択します。

      ビルドにより、WinBook ソリューションの bin\Debug サブフォルダーに BookWrapper.dll および LegacyBook.dll という 2 つのバイナリが作成されます。

概要

WCF サービスを作成して構成し、クライアントを使用してそのサービスにアクセスするには、次のことを行う必要があります。

  1. WCF サービスを作成します。
  2. サービス コントラクトを定義します。
  3. サービスを実装します。
  4. サービスをホストしてテストします。
  5. COBOL クライアント アプリケーションを作成して構成します。
  6. クライアントを実行し、サービスにアクセスします。

WCF サービス プロジェクトの作成

まず、WCF サービスおよびクライアント アプリケーションを保持するソリューションを作成する必要があります。

  1. Visual COBOL を管理者権限で起動します。これは、WCF サービスで使用するネームスペースに対する管理者権限がないという問題を防ぐためです。手順については、「Visual COBOL を管理者として起動するには」を参照してください。
  2. Visual Studio で、[ファイル > 新規作成 > プロジェクト] をクリックします。
  3. [新しいプロジェクト] ダイアログ ボックスで [インストール済み > COBOL] を展開します。
  4. [Windows デスクトップ] カテゴリをクリックします。
  5. [WCF サービス ライブラリ (.NET Framework)] を選択します。
  6. 残りのフィールドに次のように入力します。
    [名前] WCFBook
    [場所] 任意のローカル ディレクトリのフル パス (c:\VSTutorials など)。
    [ソリューション名] WCFBook
    [フレームワーク] ドロップダウン リストから.NET Framework の適切なバージョンを選択します。
  7. [ソリューションのディレクトリを作成] をオフにします
  8. [OK] をクリックします。

BookWrapper および LegacyBook デモンストレーションのソリューションへの追加

サービスとして公開する機能を含むプログラムをソリューションに追加する必要があります。これを行うには、次の手順を使用します。

  1. ソリューション エクスプローラーでソリューションを右クリックし、[追加 > 既存のプロジェクト] を選択します。
  2. Visual COBOL サンプルの Forms\BookWrapper サブフォルダーに移動します。
  3. [BookWrapper.cblproj] を選択して、[開く] をクリックします。
  4. 同様に、Forms\LegacyBook サブフォルダーにインストールされている LegacyBook デモンストレーションをソリューションに追加します。

BookWrapper および LegacyBook プロジェクトを参照として WCFBook プロジェクトに追加

サービスが BookWrapper および LegacyBook プロジェクトの機能にアクセスできるようにするには、それらのプロジェクトをプロジェクト参照として WCFBook プロジェクトに追加する必要があります。

  1. ソリューション エクスプローラーで、WCFBook プロジェクトの [参照設定] フォルダーを右クリックします。
  2. [参照の追加] を選択します。
  3. 左側のペインで [プロジェクト] を展開し、[ソリューション] をクリックします。
  4. BookWrapper プロジェクトおよび LegacyBook プロジェクトにチェック マークを入れ、[OK] をクリックします。

WCF サービス コントラクトの定義およびサービスの作成

  1. ソリューション エクスプローラーで、WCFBook プロジェクトの次のファイルの名前を変更します。
    • Service1.cbl を BookService.cbl に変更
    • IService1.cbl を IBookService.cbl に変更

    ファイルの名前を変更するには、次の手順を実行します。

    1. ソリューション エクスプローラーでファイルを右クリックし、[名前の変更] をクリックします。

      現在のプロジェクトまたはソリューション全体のいずれかで、ファイルへの参照の名前を変更する [Suggested rename] ダイアログ ボックスが開きます。

    2. [No] をクリックしてファイル名のみを変更します。
  2. 以下のコードを IBookService.cbl ファイルに貼り付けて、既存の内容を上書きします。これにより、サービスおよびデータ コントラクトが定義されます。
    • System.ServiceModel.OperationContract() 属性が付けられたメソッドは、サービス エンドポイントを介して公開される BookWrapper プログラムからの操作を定義します。
    • DataContract 属性が付けられた WCFBookWrapper.Book クラスは、BookWrapper プログラムからのデータを公開します。
           interface-id WCFBook.IBookService
                         attribute System.ServiceModel.ServiceContract().
             
           method-id GetData public
               attribute System.ServiceModel.OperationContract().
           procedure division using by value the-value as binary-long
                              returning return-value as string.
           end method.
    
           method-id GetDataUsingDataContract public
               attribute System.ServiceModel.OperationContract().
           procedure division using by value stockNumber as string
                              returning return-value as type WCFBookWrapper.Book.
           
           end method.
           
           method-id Read public attribute System.ServiceModel.OperationContract().
           procedure division using by value stockNumber as string returning theBook as type WCFBookWrapper.Book.
           end method.      
    
           end interface.
    
           class-id WCFBookWrapper.Book attribute DataContract().
           
           working-storage section.
           01 BookTitle string property as "Title" attribute DataMember().
    	   01 BookType string property as "Type" attribute DataMember().
    	   01 BookAuthor string property as "Author" attribute DataMember().
           01 BookStockno string property as "StockNumber" attribute DataMember().
           01 BookRetail decimal property as "RetailPrice" attribute DataMember().
           01 BookOnhand binary-long property as "NumberOnHand" attribute DataMember().
           01 BookSold binary-long property as "NumberSold" attribute DataMember().
           01 StockValue float-short property as "StockValue" attribute DataMember().
           
           method-id New.
           working-storage section.
           01 newBook type WCFBookWrapper.Book.
           procedure division using by value stdbook as type BookWrapper.Book.
               set BookTitle to stdbook::Title
               set BookType to stdbook::Type
               set BookAuthor to stdbook::Author
               set BookStockno to stdbook::StockNumber
               set BookRetail to stdbook::RetailPrice
               set BookOnhand to stdbook::NumberOnHand
               set BookSold to stdbook::NumberSold
               set StockValue to stdbook::StockValue
               goback.
           end method.
           
           end class.
  3. 以下のコードを BookService.cbl ファイルに貼り付けます。これは実際の WCF サービスです。
           class-id WCFBook.BookService 
                     implements type WCFBook.IBookService. 
                      
           working-storage section. 
     
           method-id GetData public. 
           procedure division using by value the-value as binary-long 
                              returning return-value as string. 
               set return-value to string::Format("You entered {0}" the-value) 
               goback. 
           end method. 
     
           method-id GetDataUsingDataContract public. 
           working-storage section. 
           01 book type BookWrapper.Book. 
           01 bookException type BookWrapper.BookException. 
           procedure division using by value stockNumber as string returning theBook as type WCFBookWrapper.Book.                
     
               try                          
                   set book to type BookWrapper.Book::Read(stockNumber) 
                   set theBook to new WCFBookWrapper.Book(book) 
               catch bookException 
                   raise new System.ServiceModel.FaultException(bookException::Message) 
               end-try 
               goback. 
           end method. 
            
           method-id Read public. 
           working-storage section. 
           01 book type BookWrapper.Book. 
           01 bookException type BookWrapper.BookException. 
           procedure division using by value stockNumber as string returning theBook as type WCFBookWrapper.Book.
     
               try 
                   set book to type BookWrapper.Book::Read(stockNumber) 
                   set theBook to new WCFBookWrapper.Book(book) 
               catch bookException 
                   raise new System.ServiceModel.FaultException(bookException::Message) 
               end-try 
               goback. 
           end method.       
     
           end class. 

レガシー コードへのアクセスの設定

さらに、BookWrapper コードを呼び出すように WCF サービスを構成する必要があります。次の手順で行います。

  1. WCF サービス プロジェクトの App.config ファイルを右クリックし、[開く] を選択します。
  2. 以下のコードを開始 <configuration> タグの直後に追加します。
      <configSections>
        <!--The following code declares a section group for application configuration -->
        <sectionGroup name="MicroFocus.COBOL.Application">
          <section name="Switches" type="System.Configuration.NameValueSectionHandler" />
          <section name="Environment" type="System.Configuration.NameValueSectionHandler" />
        </sectionGroup>
        <!--The following code declares a section group for run-time configuration -->
        <sectionGroup name="MicroFocus.COBOL.Runtime">
          <section name="Tunables" type="System.Configuration.NameValueSectionHandler" />
          <section name="Switches" type="System.Configuration.NameValueSectionHandler" />
        </sectionGroup>
      </configSections>
      <MicroFocus.COBOL.Application>
        <Switches />
        <Environment>
          <add key="dd_bookfile" value="%Public%\Documents\Micro Focus\Visual COBOL\Samples\BookData\bookfile.dat" />
        </Environment>
      </MicroFocus.COBOL.Application>
     
  3. エディターでファイルをスクロール ダウンします。

    ファイルの名前を変更した際に名前が変更されなかったデフォルトの Service1 への参照がいくつかあることに注目してください。これらの名前を手動で変更する必要があります。

  4. CTRL+H を押して、ファイル全体で文字列Service1BookService に置き換えます。
  5. App.config ファイルを保存して閉じます。
  6. WCFBook プロジェクトをビルドします。

サービス エンドポイントの構成

次に、サービス エンドポイントの詳細を構成する必要があります。次の手順で行います。

  1. WCF サービス プロジェクトの App.config ファイルを右クリックし、[WCF 構成の編集] を選択します。
  2. Microsoft サービス構成エディターで、[WCFBook.BookService] を展開します。
  3. [ホスト] をクリックします。
    注:サービスのデフォルトのベース アドレスは localhost で、Visual Studio はマシン上のサービスをホストします。
  4. [エンドポイント] を展開し、そのグループの最初の項目をクリックします。

    エンドポイントの基本要素であるサービスのアドレス (Address)、バインディング (Binding)、および公開するサービス コントラクト (Contract) が表示されます。これらはエンドポイントの ABC と総称されます。先ほど定義した IBookService コントラクトを使用するようにエンドポイントを構成する必要があります。

  5. [全般] タブで、[Contract] の行をクリックし、ブラウズ ボタン をクリックします。
  6. WCFBook プロジェクト ディレクトリの \bin\Debug サブフォルダーに移動します。
  7. WCFBook.dll ファイルをダブルクリックします。
  8. WCFBook.IBookService コントラクトを選択し、[開く] をクリックします。
  9. [エンドポイント] の下の 2 番目の項目をクリックします。

    これは、IMetaData Exchange コントラクトを介してサービスに関するメタデータの詳細を公開するデフォルトのエンドポイントです。このコントラクトは変更しません。

  10. 構成エディターで[ファイル > 保存] をクリックし、ウィンドウを閉じます。

サービスの開始およびテスト

Visual Studio にはビルトインの WCF サービス ホスト アプリケーションおよび WCF テスト クライアント アプリケーションが用意されているため、独自に作成したクライアント アプリケーションがなくてもサービスをテストできます。これは、プロジェクトのプロパティの [WCF オプション] タブでデフォルトで有効になっています。

  1. ソリューション エクスプローラーで、WCFBook プロジェクトを右クリックし、[スタートアップ プロジェクトに設定] を選択します。
  2. [デバッグ > デバッグなしで開始] をクリックします。

    サービスが WCF サービス ホストでホストされ、WCF テスト クライアント アプリケーションにロードされます。テスト クライアントに、サービスのエンドポイントおよび公開されている操作が表示されます。

  3. GetDataUsingDataContract() 操作をダブルクリックします。

    操作の詳細が表示され、さまざまなパラメーターを使用して操作をテストできます。

  4. [要求] ペインで、stockNumber の値を [m] から [1111] に変更し、Enter キーを押します。
  5. [呼び出し] をクリックします。

    [応答] ペインに BookWrapper アプリケーションのレコード 1111 に関する詳細が表示されます。

  6. 他の在庫番号を使用して、Read 操作をテストします。有効な番号は 1111、2222、3333 です。
  7. WCF テスト クライアント アプリケーションを閉じます。

WCF クライアント アプリケーションの作成

現実の世界では、さまざまなクライアント アプリケーションを使用し、その使用可能なエンドポイントを介してサービスにアクセスします。このチュートリアルでは、WCF サービス コントラクトを介して BookWrapper アプリケーションにアクセスし、そのアプリケーションに含まれるレコードを読み取る単純な .NET COBOL コンソール アプリケーションを作成します。

  1. Visual Studio で、[ファイル > 新規作成 > プロジェクト] をクリックします。
  2. [新しいプロジェクト] ダイアログ ボックスで [インストール済み > COBOL] を展開します。
  3. [Windows デスクトップ] カテゴリをクリックします。
  4. [Console Applcation (.NET Framework)] を選択します。
  5. WCFClient」などの名前を指定し、[OK] をクリックします。

WCF サービスをサービス参照としてクライアントに追加

Visual Studio には、クライアント アプリケーションで WCF サービスを使用する簡単な方法が用意されています。「サービス参照の追加」機能によって、サービスをクライアント プロジェクトに追加し、クライアントで使用するプロキシを生成できます。

  1. クライアントのプロジェクトを右クリックし、[追加 > サービス参照] を選択します。
  2. [サービス参照の追加] ダイアログで [探索] をクリックして、WCF サービスを見つけます。
  3. [名前空間] フィールドで、サービスのネームスペースの名前を [WCFBook] に変更します。
  4. [OK] をクリックします。

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

WCF サービス参照の公開された操作を使用するように WCF クライアントをプログラムする必要があります。このチュートリアルでは、クライアントは Read 操作を使用して BookWrapper アプリケーションの情報にアクセスし、指定された在庫番号のレコードを表示します。

  1. クライアント アプリケーションのプロジェクトの Program1.cbl を編集します。
  2. COBOL プログラムのコードを以下のものに置き換えます。
           program-id. Program1 as "WCFClient.Program1".
    
           data division.
           working-storage section.
           01 stock-no              string.
           01 bookClient            type WCFBook.BookServiceClient.
           01 myBook                type WCFBook.Book.
           
           procedure division.
    
           invoke type System.Console::WriteLine("Enter a stock number and press Enter.")
    
           set stock-no to type System.Console::ReadLine() 
           set bookClient to new WCFBook.BookServiceClient
           set myBook to bookClient::Read(stock-no)
           
           invoke type System.Console::WriteLine(myBook::Title)
           invoke type System.Console::WriteLine(myBook::Type)
           invoke type System.Console::WriteLine(myBook::Author)
           invoke type System.Console::WriteLine(myBook::StockNumber)
           invoke type System.Console::WriteLine(myBook::RetailPrice)
           invoke type System.Console::WriteLine(myBook::NumberOnHand)
           invoke type System.Console::WriteLine(myBook::NumberSold)
           invoke type System.Console::WriteLine(myBook::StockValue)
           
           invoke type System.Console::WriteLine("Press Enter to exit.")
           invoke type System.Console::ReadLine()
           
           
                      goback.
               
           end program Program1.
  3. [File > Save] をクリックします。
  4. クライアントのプロジェクトをビルドします。

クライアント エンドポイントの構成

WCF サービス エンドポイントおよびサービス コントラクトを使用するようにクライアントを構成する必要があります。

  1. WCFClient プロジェクトの app.config ファイルを右クリックします。
  2. [WCF 構成の編集] をクリックします。
  3. [構成] ペインで、[クライアント]、[エンドポイント] の順に展開します。
  4. [WCHttpBinding_IBookService] をクリックします。
  5. [クライアント エンドポイント] ペインおよび [全般] タブで、[Contract] の行の ブラウズ ボタン をクリックします。
  6. WCFBook プロジェクトのディレクトリにある \bin\Debug サブフォルダーに移動します。
  7. WCFBook.dll をダブルクリックします。
  8. WCFBook.IBookService コントラクトを選択し、[開く] をクリックします。
  9. Microsoft サービス構成エディター ウィンドウで、[ファイル > 保存] をクリックします。
  10. 構成エディターを閉じます。
  11. プロジェクトをビルドします。

クライアントを使用したサービスへのアクセス

  1. WCFClient プロジェクトをソリューション全体のスタートアップ プロジェクトとして設定します。
  2. [Debug > Start Debugging] をクリックします。

    サービスが WCF サービス ホストでホストされ、クライアントが起動します。

  3. コンソールで、有効な在庫番号を入力し、Enter を押します。

    その在庫番号のレコードが表示されます。