2011-12-19 11 views
5

iSeries LPAR(V6R1)上で動作するCOBOLコードから内部Webサービスを呼び出す必要があります。私は完全な例を使って、オンラインhereを見つけることができました。そこで、私の次のステップは、プロセスを繰り返し、既存のWebサービスの1つを呼び出すことでした。iSeries COBOLからWebサービスを呼び出すにはどうすればよいですか?

QSHのWSDL2WSコマンドを使用してCクライアントスタブを生成しました。私は例のCOBOLクライアントプログラムを修正し、私のWebサービスへの呼び出しを試みました。私が実行している問題は、サンプルのCクライアントメソッドがポインタを返しており、COBOLコードがそれらをポインタに割り当てているという事実に関連しているようです。

xsdc__string TestUnsuccessfulMessage(AXISCHANDLE stub) 
{ 
    AXISCHANDLE call = axiscStubGetCall(stub); 
    xsdc__string Ret = NULL; 

    axiscCallSetSoapFaultNamespace(call, "http://myserver/PSItemMaintenance/ItemMaintenanceService.svc"); 


    // ====================================================================== 
    // Initialize client engine, set SOAP version, SOAPAction, operation, etc. 
    // ====================================================================== 

    if (AXISC_SUCCESS != axiscCallInitialize(call, C_DOC_PROVIDER)) 
     return Ret; 

    if (NULL==axiscCallGetTransportProperty(call,"SOAPAction",0)) 
     axiscCallSetTransportProperty(call,AXISC_SOAPACTION_HEADER , "http://tempuri.org/IItemMaintenanceService/TestUnsuccessfulMessage"); 

    axiscCallSetSOAPVersion(call, SOAP_VER_1_1); 
    axiscCallSetOperation(call, "TestUnsuccessfulMessage", "http://tempuri.org/"); 

    // ====================================================================== 
    // Apply SSL configuration properties and user-set SOAP headers. 
    // ====================================================================== 

    axiscStubIncludeSecure(stub); 
    axiscStubApplyUserPreferences(stub); 


    // ====================================================================== 
    // Invoke web service, send/receive operation. Handle output parameters, if any. 
    // ====================================================================== 

    if (AXISC_SUCCESS == axiscCallSendAndReceive(call)) 
    { 
     if(AXISC_SUCCESS == axiscCallValidateMessage(call, "TestUnsuccessfulMessageResponse", "http://tempuri.org/", true_)) 
     { 
      Ret = axiscCallGetElementAsString(call, "TestUnsuccessfulMessageResult", 0); 
     } 

     axiscStubCheckForExtraneousElements(stub); 
    } 
    axiscCallUnInitialize(call); 
    return Ret; 
} 

I:私は自分のWebサービスメソッドのために作成WSDL2WS Cメソッドは、カスタム結果の型にシンプルxsdc_stringないポインタを返すので、私のCOBOLコードのエラーが、私の問題の根本であると思われますデバッグ・モードでWebサービスをセットアップすることができ、COBOLおよびCモジュールを呼び出すプログラムを実行すると、iSeriesからの呼び出しを見ることができます。私は単純な文字列値を返すこともわかります。

COBOLプログラムが戻り値を取得して使用しようとすると問題が発生します。それがこのようにコード化されていますときに私がMCH3601を得る

LINKAGE PROCEDURE FOR "TestSuccessfulMessage" 
       USING ALL DESCRIBED  

LINKAGE SECTION.      
01 LookupResult   PIC X(1000). 

CALL PROCEDURE "TestSuccessfulMessage" 
USING BY VALUE STUB    
RETURNING LookupResult.   

:私は、COBOLコードの関連ビットがあると考えています。ポインタに戻り、LookupResultにアドレスを設定すると、NULL値が返されます。

私はどこかに小さなディテールが欠けていることを願っています。 COBOLの経験はほとんどありません。私は、会社内の別のチームのための概念の証明として参照アプリケーションを作成しようとしています。どのような助けや、何を試してみることをお勧めしますか?私はより多くのコードを提供することができます。

更新: LookupResult宣言を作業用記憶域に移動しようとしました。 MCH3601のエラーは解消されましたが、ディスプレイにはガベージデータが残っています。データ内のiSeriesセッションに関する情報(つまり、deviceIDなど)を見ることができます。

また、リンケージセクションにLookupResultを残して、作業用ストレージにポインタを作成してみました。次に、 "LookupResult TO SETのアドレスをResultPointer"に追加しました。繰り返しても、呼び出しはエラーなく終了しましたが、LookupResultを表示するとガベージ・データが取得されます。しかし、私がLookupResultにまっすぐ戻ると戻ってくるデータとは異なります。私はこのデータのSOAPエンベロープの断片を見ることができます。

最終: 私がしなければならなかったすべての変更は、COBOLコードにありました。ここに関連部分は以下のとおりです。

WORKING-STORAGE SECTION.    
01 Endpoint    PIC X(100). 
01 STUB     USAGE POINTER. 
01 ResultPointer  USAGE POINTER. 

LINKAGE SECTION.      
01 pszEndpoint   PIC X(100). 
01 LookupResult   PIC X(7). 

CALL PROCEDURE "TestSuccessfulMessage"  
    USING BY VALUE STUB      
    RETURNING INTO ResultPointer.   

SET Address of LookupResult TO ResultPointer. 

答えて

4

私はポインタに戻り、その後、LookupResultにアドレスを設定した場合、私はNULL値で終わる 。

私はCOBOL担当者ですが、iSeriesではありません。買い手責任負担。

xsdc__stringがポインタを解決する場合、COBOLコードは、CALLのRETURNING部分のPOINTER型の変数を持つ必要があります。おそらく、C関数が実際にNULLを返しているのではないかと思います。おそらく、axiscCallInitializeがAXISC_SUCCESSを返していない可能性があります。

少なくともz/OSでは、COBOLポインター変数をWorking-StorageまたはLocal Storageのいずれかにして、そのポインター変数にLookupResultのSET ADDRESSを設定します。私はあなたが別のマシンアーキテクチャーにいるからといって変わらないと推測しています。

... FWIW

+0

ありがとうございます。私はポインタとSET ADDRESS OFコマンドも使用しようとしましたが、私のポインタ宣言がリンケージセクションにあったと思っていました。私はそれを作業用ストレージに移動しようとします。私はまた、デバッグモードでCコードを踏んだ。私はRetがNULLとして始まるのを見ることができますが、コールの後では、iSeriesデバッガーでRet = SPP:DA1A1DDC05014450と表示される値があります。 –

+1

この回答には、必要なコード変更に関する情報が含まれているため、この回答を検討しています。作業記憶域にポインタ変数を作成しました。私は "RETURNING INTO myPointer"構文を使用するように呼び出しを変更し、示唆したようにSet Address Ofコマンドを使用しました。再度、感謝します。 –

関連する問題