本チュートリアルは、この COBOL 開発システムに付属の BookWrapper デモンストレーションに基づいています。BookWrapper は、.NET データ型を COBOL データ型にマッピングする中間プログラムです。その後、既存の COBOL プログラム (book.cbl) を呼び出して、ビジネス ロジックを実行します。
このチュートリアルでは、BookWrapper プログラムの機能を WCF サービスとして公開し、コンソール アプリケーションをクライアントとして使用してそのサービスと通信します。
ここに示すデモンストレーションのより高度なバージョンが製品サンプルに付属しています。コードを確認するには、Visual COBOL サンプル ブラウザーを起動し、上部にあるドロップダウン リストから [Show .NET COBOL only] を選択して、[WCF] カテゴリで「WCF Book Service and Client」デモンストレーションを開きます。
本チュートリアルを完了するには、次のものが必要です。
ビルドにより、WinBook ソリューションの bin\Debug サブフォルダーに BookWrapper.dll および LegacyBook.dll という 2 つのバイナリが作成されます。
WCF サービスを作成して構成し、クライアントを使用してそのサービスにアクセスするには、次のことを行う必要があります。
まず、WCF サービスおよびクライアント アプリケーションを保持するソリューションを作成する必要があります。
[名前] | WCFBook |
[場所] | 任意のローカル ディレクトリのフル パス (c:\VSTutorials など)。 |
[ソリューション名] | WCFBook |
[フレームワーク] | ドロップダウン リストから.NET Framework の適切なバージョンを選択します。 |
サービスとして公開する機能を含むプログラムをソリューションに追加する必要があります。これを行うには、次の手順を使用します。
サービスが BookWrapper および LegacyBook プロジェクトの機能にアクセスできるようにするには、それらのプロジェクトをプロジェクト参照として WCFBook プロジェクトに追加する必要があります。
ファイルの名前を変更するには、次の手順を実行します。
現在のプロジェクトまたはソリューション全体のいずれかで、ファイルへの参照の名前を変更する [Suggested rename] ダイアログ ボックスが開きます。
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.
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 サービスを構成する必要があります。次の手順で行います。
<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\Enterprise Developer\Samples\BookData\bookfile.dat" />
</Environment>
</MicroFocus.COBOL.Application>
ファイルの名前を変更した際に名前が変更されなかったデフォルトの Service1 への参照がいくつかあることに注目してください。これらの名前を手動で変更する必要があります。
次に、サービス エンドポイントの詳細を構成する必要があります。次の手順で行います。
エンドポイントの基本要素であるサービスのアドレス (Address)、バインディング (Binding)、および公開するサービス コントラクト (Contract) が表示されます。これらはエンドポイントの ABC と総称されます。先ほど定義した IBookService コントラクトを使用するようにエンドポイントを構成する必要があります。
これは、IMetaData Exchange コントラクトを介してサービスに関するメタデータの詳細を公開するデフォルトのエンドポイントです。このコントラクトは変更しません。
Visual Studio にはビルトインの WCF サービス ホスト アプリケーションおよび WCF テスト クライアント アプリケーションが用意されているため、独自に作成したクライアント アプリケーションがなくてもサービスをテストできます。これは、プロジェクトのプロパティの [WCF オプション] タブでデフォルトで有効になっています。
サービスが WCF サービス ホストでホストされ、WCF テスト クライアント アプリケーションにロードされます。テスト クライアントに、サービスのエンドポイントおよび公開されている操作が表示されます。
操作の詳細が表示され、さまざまなパラメーターを使用して操作をテストできます。
[応答] ペインに BookWrapper アプリケーションのレコード 1111 に関する詳細が表示されます。
現実の世界では、さまざまなクライアント アプリケーションを使用し、その使用可能なエンドポイントを介してサービスにアクセスします。このチュートリアルでは、WCF サービス コントラクトを介して BookWrapper アプリケーションにアクセスし、そのアプリケーションに含まれるレコードを読み取る単純な .NET COBOL コンソール アプリケーションを作成します。
Visual Studio には、クライアント アプリケーションで WCF サービスを使用する簡単な方法が用意されています。「サービス参照の追加」機能によって、サービスをクライアント プロジェクトに追加し、クライアントで使用するプロキシを生成できます。
WCF サービス参照の公開された操作を使用するように WCF クライアントをプログラムする必要があります。このチュートリアルでは、クライアントは Read 操作を使用して BookWrapper アプリケーションの情報にアクセスし、指定された在庫番号のレコードを表示します。
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.
WCF サービス エンドポイントおよびサービス コントラクトを使用するようにクライアントを構成する必要があります。
サービスが WCF サービス ホストでホストされ、クライアントが起動します。
その在庫番号のレコードが表示されます。