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