2011-12-19 26 views
5

हमें आईएसरीज एलएपी (वी 6 आर 1) पर चल रहे कोबोल कोड से एक आंतरिक वेब सेवा कॉल करने में सक्षम होना चाहिए। मैंने एक पूर्ण उदाहरण के माध्यम से काम किया कि मैं ऑनलाइन here ढूंढ पाया। तो, मेरा अगला कदम प्रक्रिया को दोहराने का प्रयास करना था और हमारी मौजूदा वेब सेवाओं में से एक को कॉल करना था।मैं iSeries COBOL से वेब सेवा कैसे कॉल करूं?

मैंने सी क्लाइंट स्टब्स उत्पन्न करने के लिए क्यूएसएच से WSDL2WS कमांड का उपयोग किया। मैंने उदाहरण COBOL क्लाइंट प्रोग्राम को संशोधित किया और मेरी वेब सेवा पर कॉल करने का प्रयास किया। जिस समस्या में मैं दौड़ रहा हूं वह इस तथ्य से संबंधित प्रतीत होता है कि उदाहरण सी क्लाइंट विधियां पॉइंटर्स लौट रही हैं और COBOL कोड उन्हें पॉइंटर्स को असाइन कर रहा है। मुझे लगता है कि मेरी कोबोल कोड में एक त्रुटि, मेरी समस्या की जड़ है क्योंकि सी विधि है कि मेरी वेब सेवा विधि के लिए बनाई गई WSDL2WS कि एक कस्टम परिणाम प्रकार के लिए एक सरल xsdc_string एक सूचक नहीं देता:

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; 
} 

मैं डीबग मोड में वेब सेवा सेट कर सकते हैं और आईएसरीज़ से कॉल देख सकते हैं जब मैं प्रोग्राम चलाता हूं जो कोबोल और सी मॉड्यूल कहता है। मैं यह भी देख सकता हूं कि मैं एक साधारण स्ट्रिंग मान वापस लौट रहा हूं।

समस्या तब आती है जब COBOL प्रोग्राम वापसी मूल्य लेने और इसका उपयोग करने का प्रयास करता है। मुझे विश्वास है कि कोबोल कोड के प्रासंगिक बिट कर रहे हैं:

LINKAGE PROCEDURE FOR "TestSuccessfulMessage" 
       USING ALL DESCRIBED  

LINKAGE SECTION.      
01 LookupResult   PIC X(1000). 

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

मैं एक MCH3601 जब यह इस तरह से कोडित है। अगर मैं एक सूचक में वापस आ जाता हूं और फिर पता को LookupResult पर सेट करता हूं, तो मैं एक शून्य मान के साथ समाप्त होता हूं।

मुझे आशा है कि मुझे बस थोड़ा सा विवरण याद आ रहा है। मेरे पास बहुत कम COBOL अनुभव है। मैं बस हमारी कंपनी के भीतर किसी अन्य टीम के लिए अवधारणा के सबूत के रूप में एक संदर्भ ऐप बनाने की कोशिश कर रहा हूं। किसी भी मदद, या सुझावों के सुझावों की सराहना की जाएगी। मैं अधिक कोड की आपूर्ति कर सकता हूं।

अद्यतन: मैंने लुकअप रीसेट घोषणा को काम करने वाले भंडारण में स्थानांतरित करने की कोशिश की। हालांकि एमसीएच 3601 त्रुटि को समाप्त कर दिया गया, मुझे बस अपने प्रदर्शन में कचरा डेटा का एक गुच्छा मिला। मैं डेटा के भीतर अपने iSeries सत्र (यानी डिवाइस आईडी, आदि ...) के बारे में जानकारी के टुकड़े देख सकता हूं।

मैंने लिंक अनुभाग में लुकअप रेसल्ट छोड़ने और काम करने वाले भंडारण में एक सूचक बनाने की भी कोशिश की। फिर मैंने "परिणाम के लिए लुकअप रीसेट का सेट पता" जोड़ा। दोबारा, कॉल बिना त्रुटि के समाप्त हो गया, लेकिन जब मैं लुकअप रिसेट प्रदर्शित करता हूं तो मुझे कचरा डेटा मिलता है। हालांकि, यह वापस आने वाले डेटा से अलग है अगर मैं सीधे लुकअप रीसेट में वापस आ जाता हूं। मैं इस डेटा में एसओएपी लिफाफे के टुकड़े देख सकता हूं।

अंतिम: मुझे जो भी परिवर्तन करना है वह कोबोल कोड में था। यहाँ प्रासंगिक पीस हैं:

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 व्यक्ति हूं, लेकिन iSeries पर नहीं। चेतावनी emptor।

यदि xsdc__string एक सूचक को हल करता है, तो आपके COBOL कोड में कॉल के रिटर्निंग हिस्से के लिए प्रकार के पॉइंटर का चर होना चाहिए। शायद सी फ़ंक्शन वास्तव में वापस लौट रहा है, कोड निश्चित रूप से इसके लिए अनुमति देता है - शायद axiscCallInitialize AXISC_SUCCESS वापस नहीं कर रहा है।

कम से कम जेड/ओएस पर, आप कोबोल पॉइंटर वैरिएबल या तो वर्किंग-स्टोरेज या लोकल स्टोरेज में होना चाहते हैं, और फिर आप उस पॉइंटर वैरिएबल को लुकअप रीसेट का पता लगाएंगे। मुझे लगता है कि यह सिर्फ इसलिए नहीं बदलता क्योंकि आप एक अलग मशीन आर्किटेक्चर पर हैं।

... FWIW

+0

धन्यवाद। मैंने एक सूचक और आदेश के सेट पते का उपयोग करने की कोशिश की लेकिन उस समय मुझे विश्वास है कि मेरी सूचक घोषणा लिंक अनुभाग में थी। मैं इसे काम करने के भंडारण में ले जाने की कोशिश करूंगा। मैं डीबग मोड में सी कोड में भी कदम रखा। मैं देख सकता हूं कि रेट न्यूल के रूप में शुरू होता है, लेकिन कॉल के बाद इसका मूल्य होता है, जो iSeries डीबगर में रेट = एसपीपी: डीए 1 ए 1 डीडीसी05014450 के रूप में दिखाता है। –

+1

मैं इस उत्तर पर विचार कर रहा हूं क्योंकि इसमें कोड परिवर्तन के बारे में जानकारी है जो मुझे करने की आवश्यकता है। मैंने काम करने वाले भंडारण में एक सूचक चर बनाया। मैंने कॉल को "मेरे पॉइंटर में रिटर्निंग" वाक्यविन्यास का उपयोग करने के लिए बदल दिया और जैसा कि आपने सुझाव दिया था, सेट के सेट एड्रेस का इस्तेमाल किया। एक बार फिर धन्यवाद। –

संबंधित मुद्दे