2011-12-19 2 views
5

iSeries LPAR (V6R1)에서 실행중인 COBOL 코드에서 내부 웹 서비스를 호출 할 수 있어야합니다. 나는 완전한 예를 통해 온라인으로 here을 찾을 수 있었다. 그래서, 다음 단계는 프로세스를 반복하고 기존 웹 서비스 중 하나를 호출하는 것입니다.iSeries COBOL에서 웹 서비스를 호출하려면 어떻게합니까?

QSH의 WSDL2WS 명령을 사용하여 C 클라이언트 스텁을 생성했습니다. 예제 COBOL 클라이언트 프로그램을 수정하고 내 웹 서비스에 대한 호출을 시도했습니다. 내가 겪고있는 문제는 예제 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 : 나는 내 웹 서비스 메서드에 대해 생성 WSDL2WS는 C의 방법은 사용자 지정 결과 유형에 간단한 xsdc_string하지 않은 포인터를 반환하기 때문에 내 COBOL 코드에서 오류가, 내 문제의 근본 것으로 의심 디버그 모드에서 웹 서비스를 설정할 수 있으며 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 값으로 끝납니다.

어딘가에 작은 세부 사항이 누락 되었기를 바랍니다. 나는 코볼 경험이 거의 없다. 저는 회사 내의 다른 팀을위한 개념 증명으로 참조 앱을 만들려고합니다. 어떤 도움을 주거나 시도해 볼 것을 제안하면 감사하겠습니다. 더 많은 코드를 제공 할 수 있습니다.

업데이트 : LookupResult 선언을 작업 저장소로 옮겨 보았습니다. MCH3601 오류가 없어지는 동안 화면에 가비지 데이터가 생겼습니다. 데이터 내에서 iSeries 세션 (즉, deviceID 등)에 관한 정보를 볼 수 있습니다.

또한 Linkage 섹션에 LookupResult를 남겨두고 작업 저장소에 포인터를 만들려고했습니다. 그런 다음 "SET Address of LookupResult TO 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에 주소를 설정하면, 내가 널 값으로 끝낼 .

본인은 COBOL 사용자이지만 AS/400 시스템 사용자는 아닙니다. 경고.

xsdc__string이 포인터로 해석되면 COBOL 코드는 CALL의 RETURNING 부분에 대해 POINTER 유형의 변수를 가져야합니다. 아마도 C 함수가 실제로 NULL을 반환하고 코드에서 확실히 허용합니다. 아마도 axiscCallInitialize가 AXISC_SUCCESS를 반환하지 않을 수도 있습니다.

적어도 z/OS에서는 COBOL 포인터 변수가 Working-Storage 또는 Local Storage에 있어야하고 LookupResult의 ADDRESS를 해당 포인터 변수에 설정해야합니다. 나는 당신이 다른 기계 아키텍처를 사용하고 있기 때문에 바뀌지 않는다고 생각합니다.

... FWIW

+0

고맙습니다. 나는 포인터와 SET ADDRESS OF 명령을 사용해 보았습니다. 그러나 포인터 선언이 링크 섹션에 있다고 생각할 때가있었습니다. 작업 저장소로 옮겨 보겠습니다. 나는 또한 디버그 모드에서 C 코드를 밟았다. Ret가 NULL로 시작하지만 호출 후 iSeries 디버거에서 Ret = SPP : DA1A1DDC05014450으로 표시되는 값이 있음을 알 수 있습니다. –

+1

이 코드에는 필요한 코드 변경에 대한 정보가 포함되어 있으므로이 대답을 고려하고 있습니다. 작업 저장소에 포인터 변수를 만들었습니다. "RETURNING INTO myPointer"구문을 사용하도록 호출을 변경하고 제안 된대로 Set Address Of 명령을 사용했습니다. 다시 한번 감사드립니다. –

관련 문제